0%

【Pwn#0x04】BUUCTF get_started_3dsctf_2016

十分诡异的情况:本地打得通,远程打不通并提示timeout: the monitored command dumped core。

推测原因如下:
程序有比较严格的对于栈的要求,并且由于没有用setbuf来关闭buffer,导致本应直接输出的一些字符串只有在满足某些条件之后才会从buffer里面输出给I/O。具体哪些条件呢?我不知道……

原来的EXP如下:

1
2
payload = b'a'*0x38
payload += pack(backdoor) + pack(elf.sym["main"]) + pack(814536271) + pack(425138641)

本题有backdoor函数可以直接把flag打印出来,但是会提前检查两个参数。
最最开始我是直接用检查之后的一个地址作为backdoor的,但是这样似乎无法满足对于栈的要求。
所以改成了上面这样,backdoor函数的返回地址我随便填了一个main。

然而不行,于是去网上看到了这个师傅的wp:get_started_3dsctf_2016 题解 -lifanxin的博客
发现只要把返回地址改成exit,就可以正常退出,然后把字符串真的打印出来(不这样的话,可能会在从Buffer中输出前就报错导致没法正常拿到flag)。

然后EXP改成如下的样子(静态链接的,所以exit里面有):

1
2
payload = b'a'*0x38
payload += pack(backdoor) + pack(elf.sym["exit"]) + pack(814536271) + pack(425138641)

用这个成功打通拿到flag。