首先打开程序,发现是个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题的能发发吗。。