Nepnep联合战队PWN见习生报告-第二周

发布于 2021-12-03  97 次阅读


正文

Attack Lab[Updated 1/11/16])

看题目描述我这可来劲了啊!

写ROP什么的最畅快了(大雾)

先下载题目文件康康

有两个主体文件,总共包含五道题目

直接IDA

第一个文件ctarget

第一题touch1

先是学到了一个好东西(优秀的开发实现)

is_checker被放在bss段,恒0

不过也不是重点,同时我很难想象啥情况下这个值为true

然后main首先来到这里

所以这里是最简单的ret2,不过!且慢!

先来checksec检查一下

这里有canary

但是蹊跷的事情发生了!!

利用点这里并没有canary

稍微翻了一下GCC的文档大概理解了

简单来说,GCC会用一种启发式的算法判断一个函数需不需要canary保护

如果需要则会生成

https://z3.ax1x.com/2021/12/03/oaz6qx.png

当然也可以选择强制开启all-canary

最终payload很简单,因为这一层题目基本可以认为是没保护的

b'A'* 40 + p64(0x4017C0)

第二题touch2

这里也比较基础

只需要pop edi;retn就行

先ROP找一下

令0x000000000040141b为变量val_pop_rdi

同时因为没开PIE,所以用常数0x4017EC作为函数目标就可以了

画个图看看堆栈的样子

这里的cookie是定值

在笔者的机器上,值为0x59b997fa

因此payload是

payload1 = b'A'* 40 + p64(val_pop_rdi) + p64(0x59b997fa) + p64(0x4017EC)

第三题touch3

这里太麻烦了(其实也没多麻烦,就是要搞个random,得再试验一下本机的random%100,而且考虑到前面已经操作过两三次random的样子,更麻烦了2333)

于是我打算直接劫持validate函数

payload1 = b'A'* 40 + p64(val_pop_rbx) + p64(0x3) + p64(0x401D41)

总的来说还是比较简单的,因为没啥实质性保护

第二个文件rtarget

我写到这里才发现,这里第一个文件的预期解是代码注入,而我直接用ROP的方法做了(毕竟是pwn手)

但是实际上第二个文件的预期解才是ROP

所以这里我就不重复一遍了

(完)