逆向实践之are_u_ok_HCTF2017

2017-11-15  本文已影响0人  苏州暮雨

题目链接:http://pan.baidu.com/s/1jH9ILoU 密码:iann

题目分析:这是一个多进程运行,使用ptrace函数进行进程间通信的程序。函数识别参数个数,来设置进程走向,利用scanf来接收flag。默认是允许输入%48s,刷新了缓存区,使得不会出现pwn的情况。函数主体流程经历了一次RC4加密,使用ptace进行了程序内存的更换。

解决方案:

函数参数由argc与argv表示,例如:执行 ./edit edit.txt 时,argc 的值为 2, argv[0] 为 ./edit,argv[1] 为 edit.txt .在没有带参数进入的时候,fork出一个子进程,子进程使用execve执行本程序,函数参数添加上了parent_pid。

父进程fork子进程重创程序 父进程进入debugloop

其中使用ptrace函数进行调试交互,获取进程的寄存器,判断是否可写,进而控制内存,使用一行代码来设置终端,其中的0xcc就是Int 3的对应汇编码:ptrace(PTRACE_POKEDATA,pid,brk_addr,0xcccccccccccccccc);需要提出来的是,在一些文章中谈到ptrace函数的时候,函数每一次进行POKEDATA请求的时候只写入一个字节,这道题的编程语言表示为一个long数据,或者说,这个写入的大小可以控制。

新进程进行交互

其中的is_trace函数是自己定制的,通过读取/proc/self/status进程状态来控制进程是否循环loop等待交互。

在debugloop中,先设置一个中断

跳转到很长的一段字符串处,在IDA中转变成代码如下:其中有一处为decrpt_data函数,主要功能是将rc6的加密区域使用rc4进行加密,再数据段中的表示如下:

在恢复进程运行之后,设置新的起点,将跳转到leijun字符串处,也就是下面对应的代码,在jnz处函数跳转到上图的函数处(此时已经解密过了):

最后利用网上RC6算法进行解析,得到结果。

参考官方WP

上一篇下一篇

猜你喜欢

热点阅读