首页 > 代码库 > root-me/anti-debug

root-me/anti-debug

最近迷上了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

root-me/anti-debug