iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
0
Security

CTF30系列 第 23

CTF 14: classic (Pwn, SECCON 2018 Online CTF)

一開始下 disassemble main 時,還想說這是哪國來的組語,完全看不懂在寫啥

(gdb) disassemble main
Dump of assembler code for function main:
   0x00000000004006a9 <+0>:     push   %rbp
   0x00000000004006aa <+1>:     mov    %rsp,%rbp
   0x00000000004006ad <+4>:     sub    $0x40,%rsp
   0x00000000004006b1 <+8>:     mov    $0x400774,%edi
   0x00000000004006b6 <+13>:    callq  0x400520 <puts@plt>
   0x00000000004006bb <+18>:    mov    $0x40078e,%edi
   0x00000000004006c0 <+23>:    mov    $0x0,%eax
   0x00000000004006c5 <+28>:    callq  0x400540 <printf@plt>
   0x00000000004006ca <+33>:    lea    -0x40(%rbp),%rax
   0x00000000004006ce <+37>:    mov    %rax,%rdi
   0x00000000004006d1 <+40>:    callq  0x400560 <gets@plt>
   0x00000000004006d6 <+45>:    mov    $0x40079f,%edi
   0x00000000004006db <+50>:    callq  0x400520 <puts@plt>
   0x00000000004006e0 <+55>:    mov    $0x0,%eax
   0x00000000004006e5 <+60>:    leaveq
   0x00000000004006e6 <+61>:    retq

然後才想到 gdb 預設好像是 at&t 的組語。所以:

(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
   0x00000000004006a9 <+0>:     push   rbp
   0x00000000004006aa <+1>:     mov    rbp,rsp
   0x00000000004006ad <+4>:     sub    rsp,0x40
   0x00000000004006b1 <+8>:     mov    edi,0x400774
   0x00000000004006b6 <+13>:    call   0x400520 <puts@plt>
   0x00000000004006bb <+18>:    mov    edi,0x40078e
   0x00000000004006c0 <+23>:    mov    eax,0x0
   0x00000000004006c5 <+28>:    call   0x400540 <printf@plt>
   0x00000000004006ca <+33>:    lea    rax,[rbp-0x40]
   0x00000000004006ce <+37>:    mov    rdi,rax
   0x00000000004006d1 <+40>:    call   0x400560 <gets@plt>
   0x00000000004006d6 <+45>:    mov    edi,0x40079f
   0x00000000004006db <+50>:    call   0x400520 <puts@plt>
   0x00000000004006e0 <+55>:    mov    eax,0x0
   0x00000000004006e5 <+60>:    leave
   0x00000000004006e6 <+61>:    ret
End of assembler dump.

這就正常多啦。
看起來我們的程式呼叫 gets 時是沒有加保護的。這裏有幾個暫存器:

  • rbp: stack 的底部
  • rsp: stack 目前頂端位置
  • rax: 一般暫存器
  • rdi: 操作目標 (例如 gets 的目標位置)
  • edi: 32-bit 版的 rdi
  • eax: 32-bit 版的 rax

因為這程式是 64bit,所以暫存器開頭都是 r。然後 rbp 長度會是 8,故返回地址會是 rbp - 0x40 - 0x8 -> rbp - 0x48

我們應該是可以影響程式執行路徑啦,問題是我們這裏影響之後可以幹嘛?

  1. 直接去跑 flag() 函式?
  2. 想辦法生 shell?

這程式沒有 flag() 這種函式,但是題目有附上一個 libc 的檔案。所以我們應該是要用某種方式,生一個 shell 然後想辦法拿 flag。


上一篇
CTF 14: classic (Pwn, SECCON 2018 Online CTF)
下一篇
CTF 14: classic (Pwn, SECCON 2018 Online CTF)
系列文
CTF3030
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言