hackctf

HackCTF의 RTC 문제다. 문제 명처럼 return to csu 기법을 사용해야한다. 덕분에 rtc 공격을 복습할 수 있는 좋은 경험이 됐다. 문제 파일로는 바이너리 파일과 libc가 주어진다. 바이너리를 실행해보면 "Hey, ROP! What's Up?"이라는 ROP에게 안부를 물어보는 문구가 출력되고 그 다음 줄에 입력을 받는다. 보호기법을 확인해보면 NX bit만 걸려있는 것을 볼 수 있다. full relro가 아니라 partial이기 때문에 got overwrite 기법도 사용 가능할 것이다. 일단 ida로 열어보겠다. 코드는 굉장히 간단하다. write 함수로 문구를 출력해준 뒤 read 함수로 0x200byte만큼 입력을 받는다. 딱봐도 overflow가 발생한다. 쉘을 얻게해주는 함수..
HackCTF의 Look at me 문제다. 문제를 푼 뒤 다른 사람의 write up들을 확인했을 때, 내 풀이와 차이가 많이 나서 당황했다. (나는 sysrop로 풀었지만 다른 사람들은 mprotect 함수를 이용해 쉘 코드가 존재하는 주소에 실행 권한을 준 뒤, 해당 주소로 ret를 변조해 풀었다.) 문제 파일로는 바이너리 하나만 주어져 있다. 바이너리 파일을 실행해보면 "Hellooo..."가 첫 줄에 출력되고 두 번째 줄에서 사용자 입력을 받음을 알 수 있다. 보호기법은 nx bit만 걸려 있는 것을 알 수 있다. 또한 32bit 바이너리인 것을 알 수 있다. ida로 바이너리를 열어보면 함수가 엄청 많이 존재하는 것을 볼 수 있다. 이는 이 바이너리가 static linking 방식으로 컴파일..
HackCTF의 암호학 문제 Great Binary다. 머리 좀 식힐겸 한 번 풀어봤다. 문제 파일의 압축을 풀어보면 hoooo.txt 파일이 나온다. 이 txt 파일 안의 내용을 해독한다면 flag를 얻을 수 있을 것 같다. 이미지 안에는 딱봐도 2진수처럼 보이는 값들이 들어있다. 낮은 점수의 문제라는 점과 솔버(solver)수가 많은 것을 고려했을 때, 그냥 2진수를 10진수로 변환한 뒤 해당 10진수 값에 해당하는 아스키 문자를 구한다면 flag가 나오지 않을까 생각이 든다. with open('./hoooo.txt', 'r') as f: array = f.read().split(' ') for i in array: print(chr(int(i,2)), end='') print() 위와 같은 코드를..
이번에 풀이할 문제는 HackCTF의 SysROP문제다. 이름처럼 Syscall을 활용한 ROP 공격을 수행해야될 것 같다. 문제 파일로는 binary와 libc 파일이 주어져 있다. 바이너리 파일을 실행해보면 사용자의 입력만 받고 종료되는 것을 볼 수 있다. 보호기법은 NX bit만 걸려있다. main함수를 ida로 확인해보면 read 함수로 0x78byte만큼 buf에 입력을 받는데, 이 과정에서 overflow가 발생하는 것을 알 수 있다. nx bit가 걸려있기 때문에 rop 공격을 하는 식으로 가야겠지만, 문제는 출력해주는 함수가 없다. system 함수를 통해 쉘을 얻든, 원샷 가젯을 쓰든 libc base를 구해야지 가능한 것인데 leak를 위한 출력함수가 없기에 현재의 내 지식으로는 일반적..
HackCTF의 ROP 문제다. x86 ROP 공격을 복습할겸 풀어봤다. 바이너리와 libc가 주어져 있다. 바이너리를 실행해보면 입력을 받은 후 그 다음 줄에 "Hello, World!"를 출력해준다. 보호기법을 확인해보면 nx bit만 걸려있다. 문제명 그대로 x86 rop 공격을 해야할 것 같다. main 함수를 ida로 확인해보면 이름부터 취약한 vulnerable_function() 함수를 호출하고 write 함수로 "Hello World"를 출력해준다. 입력은 vulnerable_function에서 받는 것 같다. vulnerable_function을 보면 read 함수를 통해 buf에 0x100만큼 입력을 받는 것을 볼 수 있다. buf의 크기가 0x88인데 0x100만큼 입력을 받으므로 오..
이번에 풀이할 문제는 HackCTF의 RTL_Core 문제다. 문제 파일로는 바이너리와 libc가 주어져 있다. 문제 파일을 실행해보면 Passcode를 입력 받는다. 입력 값을 검증해서 성공, 실패 여부를 결정하는 것 같다. 보호 기법은 nx bit만 걸려 있는 것을 알 수 있다. ida로 main 함수를 확인해보면 입력 값을 bof에 취약한 함수 gets로 받고, 입력 값을 check_passcode 함수의 인자로 전달한 후 리턴 값과 hashcode라는 값과 비교한다. ida에서는 한글이 깨져서 이상하게 나와 있지만, 어쨌든 hashcode와 일치한다면 무언가를 출력해준 뒤, core 함수를 호출해준다. 일치하지 않을 경우 위에서 봤던 "실패!" 문구를 출력해주는 것 같다. 잠만 깨진 문구가 이상하..
HackCTF의 Random Key 문제다. 전에 참여했던 ctf에서 비슷한 유형의 문제를 풀어봤기(삽질했기) 때문에 굉장히 쉽게 풀 수 있었다. 문제 바이너리를 실행해보면 다음과 같이 인증 프로그램이라는 문구가 출력되고 input key 입력을 받는다. 그 후 어떠한 로직을 통해 입력한 키 값이 올바른지 검증 후 결과를 출력해주는 것 같다. 코드는 간단하다. 문구들을 출력하고 scanf로 입력을 받는데(%d로 입력 받는다. 취약점 없다 ㅋㅋ), 입력 받은 값이 rand 함수를 통해 랜덤으로 생성한 값과 일치하다면 flag를 준다. 참고로 이 srand(time(NULL));를 써줬기 때문에 매번 생성되는 값은 랜덤하다. 겉보기에는 취약해보이지 않지만, 들으면 아!하고 무릎을 탁 칠만큼 기발한 공격 방법..
이번에 풀이할 문제는 HackCTF의 g++ pwn 문제다. 문제 이름이 g++걸 봐서 c++ 소스 코드를 컴파일해주는 g++ 컴파일러가 생각난다. 문제 파일을 실행해보니 입력을 받고, 입력을 받은 값을 출력해주는 동작을 한다. 혹시하고 입력 값으로 많은 1 값을 줬지만 Segment fault 오류는 터지지 않는 것을 알 수 있다. bof 문제가 아닐 수도 있는 것 같다. 보호기법은 nx만 걸려있는 것을 알 수 있다. ida는 제대로 해석을 못하는 것 같아서 ghidra로 main 함수를 확인해봤다. main 함수는 vuln 함수만 호출한다. vuln 함수를 확인해보면 fgets 함수를 이용해 local_40에 32byte만큼 입력을 받는 것을 알 수 있다. local_40의 크기는 32byte인데, ..
이번에 풀이할 문제는 HackCTF의 RTL_World 문제다. 요즘 HackCTF 문제를 잘 안풀고 있었는데, 갑자기 HackCTF 포너블 문제를 올클해보자는 욕구가 생겨 풀이하게 됐다. 일단 문제 명만 봤을 때는 rtl 공격 기법이 쓰일 것 같다. 문제 파일을 실행해본다면 다음과 같은 문구가 출력된다. 신박해보인다. 저기 나온 선택지를 다 선택해봤지만 딱히 얻을 수 있는 정보는 없었다. 다만 3, 4번은 어느정도의 자본(gold)이 필요하다는 것을 알게됐고, 이 파일의 목적은 binary boss를 죽이는, 즉 exploit하는 것임을 알 수 있었다.(1번 선택지를 선택하면 문제 파일의 보호기법이 출력된다.) 일단 ghidra로 열어봐야겠다. undefined4 main(void) { int iVar..
이번에 풀이할 문제는 HackCTF의 Yes or no 문제로 x64 rop 공격이 쓰이는 문제인데, 풀 당시에는 x64 rop뿐만 아니라 x86 rop 공격에도 무지했기 때문에 시간이 많이 소요됐다. (포스팅이 많이 늦은 이유기도 하다.) 문제 파일은 다른 문제들과 달리 binary 파일과 libc-2.27.so가 있다. libc-2.27.so 파일은 문제 서버와 로컬 서버의 libc base 주소가 다르기 때문에, 이 파일을 참고해 서버 libc base address 기준으로 exploit 할 수 있도록 하는 것이다. 문제 파일을 실행하기 전 보호기법을 확인해봤다. NX가 걸려 있어 쉘 코드를 삽입할 수 없고 64bit 파일인 것을 알 수 있다. stack canary가 없는 것을 봐서 추측할 수 ..
dyp4r
'hackctf' 태그의 글 목록