[Reverse]xx_warmup_obf


1.全靠IDA远程动态调试肝,懵懵懂懂的做完了这道题。

        signal函数

  1. typedef void (*sighandler_t)(int);
  2. 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}

 

 

 

 

打赏还是打残,这是个问题
0x00 题目名称
[强网先锋] Funhash - Donek1
立即登录, 发表评论.
没有帐号? 立即注册
0 条评论