oflo ---- N1ctf 2020

首先打开程序,发现是个ELF文件,然后打开IDA找到main函数按F5试图反汇编,但是按了一下,发现好像不行。
在这里插入图片描述
然后看到下面有一串花指令,随手去掉。
在这里插入图片描述
然后发现上面有一堆数据,按c进行编译
在这里插入图片描述
发现编译了的下面还是有一串花指令,顺手去掉
在这里插入图片描述

整理
在这里插入图片描述
但是还是不能反编译,于是继续看。发现一串奇怪的代码,观察作用,发现并没有什么用,混淆编译器用的花指令。顺手拿掉,同样还发现程序里面有很多个这个。全部去掉。
在这里插入图片描述

.text:0000000000400B0E E8 03 00 00 00                          call    loc_400B16
.text:0000000000400B0E                         ; ---------------------------------------------------------------------------
.text:0000000000400B13 E8                                      db 0E8h
.text:0000000000400B14 EB                                      db 0EBh
.text:0000000000400B15 12                                      db  12h
.text:0000000000400B16                         ; ---------------------------------------------------------------------------
.text:0000000000400B16
.text:0000000000400B16                         loc_400B16:                             ; CODE XREF: sub_400A69+A5↑j
.text:0000000000400B16 58                                      pop     rax //把地址传到rax
.text:0000000000400B17 48 83 C0 01                             add     rax, 1 //地址加一
.text:0000000000400B1B 50                                      push    rax //压入
.text:0000000000400B1C 48 89 E0                                mov     rax, rsp //栈顶指针赋值到rax
.text:0000000000400B1F 48 87 00                                xchg    rax, [rax] //栈顶指针指的值也就是地址加一和rax中存的栈顶指针互换
.text:0000000000400B22 5C                                      pop     rsp //把之前栈顶指针值弹到rsp
.text:0000000000400B23 48 89 04 24                             mov     [rsp], rax //把rax中存放的下一位地址传到栈离
.text:0000000000400B27 C3                                      retn //retn的指令会自动移到下一位,再加上原本加了1,就正好运行到了400B14的位置跳过了400B13
.text:0000000000400B14 EB 12                                   jmp     short loc_400B28 //按c看看400B14的代码是啥

在这里插入图片描述
这边直接搜索xchg这个函数。然后发现整个程序里面有四处,全改了。
改完之后就能看之前按c编译出来的那一串代码了。

在这里插入图片描述
又把另外一段也整理反编译了下。整理出来几段函数
在这里插入图片描述

但是看函数好像还是不大对头。。于是打算开始动调。。

然后发现了这个函数,qword_602048指向的是之前编译出来的一个函数,a1 - 572是一个计数器,而a1 - 560是你的输入,所以猜测这个函数应该是根据你的输入前五位来修复之前的qword_602048指向的函数。输入前五位是n1ctf,所以输入n1ctf再在这下个断点。
在这里插入图片描述
qword_602048指向的函数
在这里插入图片描述
然后就能看到函数已经被修护完毕。
在这里插入图片描述
F5成功反编译
在这里插入图片描述
观察看到retaddr里面存放的是上面的那一串数组,a1中存放的是Linux的版本号,a2是你的输入

在这里插入图片描述
a1中存放的值,写出脚本

>>> a = [53,45,17,26,73,125,17,20,43,59,62,61,60,95]
>>> b = [0x4c,0x69,0x6e,0x75,0x78,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20]
>>> flag = ''
>>> for i in range(len(a)):
	flag += chr(a[i] ^ (b[i] + 2))

	
>>> flag
'{Fam3_is_NULL}'

再加上n1ctf
所以就是n1ctf{Fam3_is_NULL}

哪位大表哥还有re题的能发发吗。。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值