最近迷上了ELF逆向,觉得挺有意思。做了几道相关的题目后,深刻体会到debug大法好,有很多反debug的题目只需要修改几个跳转照样debug,直到我遇到这道题目。
这个类型的题目第一次遇见,查阅了一下资料,48号系统调用是sys_signal
根据以上信息,可以看出这个程序执行到int 3处时捕获断点,然后执行sigtrap的handler指向的函数,即本题目中我标记为code的地方。
这样如果用debugger运行这个程序,那么debugger会捕获断点并运行debugger自己的int 3 handler(即将控制转移到debugger),这样会导致程序中的代码将无法执行。
本来我打算将程序运行起来在进行输入的时候用debugger attach这个进程来看代码,结果读取输入的函数和进行解密比较的函数不是同一个函数,以我目前的姿势水平只能静态分析代码了,debug大法看来不能用了。
当然,这个程序肯定不会让我轻轻松松分析出来的,这个程序执行了5个函数,并用第一个函数将剩余4个函数进行了异或,不过这种程序的加密(根本算不上加密。。。)是没什么难度的。
from pwn import * f = open(‘./0xx‘, ‘rb‘) #0xx是4个被异或了的函数的二进制文件 s = f.read() code = ‘‘ i = 0 while i * 4 < len(s): code += p32(u32(s[i*4:i*4+4]) ^ 0x8048FC1) i += 1 save = open(‘save‘, ‘wb‘) save.write(code)
然后用ida运行code,分一下函数,就清晰明了了。程序用第3个函数读取输入,关键在于第4、5个函数。
其中输入保存在8048251h处,第4个函数将输入的每个字符与FCh进行异或,然后与80482D1h处的字符串作比较。
只需将80482D1h处字符串与FCh异或即可得到flag。
f = open(‘./src‘, ‘rb‘) src = f.read() ans = ‘‘ for i in src: ans += chr(ord(i) ^ 0xfc) print ans
总结:我觉得肯定有办法debug这个程序,但是我姿势水平低,若有表哥有办法,还请表哥不吝赐教。
题目地址:http://challenge01.root-me.org/cracking/ch13/ch13.zip
时间: 2024-08-10 19:10:15