[Reverse]xx_warmup_obf
1.全靠IDA远程动态调试肝,懵懵懂懂的做完了这道题。
signal函数
- typedef void (*sighandler_t)(int);
- sighandler_t signal(int signum, sighandler_t handler);
第一个参数signum:指明了所要处理的信号类型
第二个参数handler:描述了与信号关联的动作
这个程序会触发两种信号,一个是SIGTRAP,一个是SIGALRM。SIGTRAP是INT3引起的,SIGALRM是程序超时引起的。
int3如果传递给程序,程序的signal函数接受SIGTRAP信号,会运行handler函数,函数会设置data段的数据,不会陷入死循环。
也就是说,程序期望接收到自己代码段中的INT 3引起的SIGTRAP。并且SIGALRM不应该传递给程序,否则会直接退出。
设置IDA的debugger options,把SIGTRAP的处理方式设置成pass to application,并且遇到SIGALRM的时候,选择discard
2.0x408AD6为输入函数地址。
0x408DC2 附近调用了strchr,后面的大概在判断程序有没有输入。
0x409149附近调用了strlen,在0x409174与0x1c进行了比较,所以输入的长度为0x1c(28)
3.程序中有一大堆这种毫无意义的混淆代码。
4.从0x402D05 开始,有一系列的cmp和jz
[rbp-8]为程序输入的地址,例如图片的意思就是:s[1]*0x44b38+s[0]*0xFFFFE483==0x1C4C7D2
总共有28个这样的方程
解出来就好了(手动把这些方程抄下来...太累了...)
flag: flag{g0_Fuck_xx_5egm3nt_0bf}
打赏还是打残,这是个问题
没有帐号? 立即注册