HackCTF

    [Pwnable] RTL_Core

    250점 첫 문제다 :D 바로 풀어보자 NX bit만 enabled 되어 있고 Partial RELRO가 걸려있다. 실행시키면 패스코드를 입력하라는 문자열과 함께 아무 값이나 입력하면 실패! 라고 알려준다 아이다로 열어보자 입력값 s가 인자로 들어가는 check_passcode의 리턴값이 hashcode와 같게 되면 core 함수가 실행된다. hashcode는 0x0C0D9B0A7 (3235492007)이다. check_passcode를 살펴보자 반복문을 살펴보면 v2 += 0 + a1 v2 += 4 + a1 v2 += 8 + a1 v2 += 12 + a1 v2 += 16 + a1 그 후 v2를 리턴해준다. 그렇다면 v2의 값이 hashcode (3235492007)와 같아져야 한다. 그럼 hashcod..

    [Pwnable] Random Key

    오늘은 마지막 200점 문제이다 :D NX bit만 걸려있으며, Partial RELRO이다. 실행을 시키면 인증 프로그램이라는 문자열과 함께 key를 입력하고 "Nah.."라는 문자열을 출력한다. 아이다로 열어보면 v5에 랜덤 값이 들어가며 우리가 입력하는 입력값이 v4에 들어가게 된다. 만약 우리의 입력값이 랜덤 값인 v5와 일치하게 된다면 flag를 보여주는데 우리가 프로그램에서 돌아가는 랜덤값을 어떻게 유추할 수 있을까? 코드를 다시 한번 잘보면 v3에 time 함수가 들어갑니다. time() = 시간에 대한 정보를 얻어오는 함수 결론은 srand로 시드값을 현재 시간으로 설정하고 rand로 랜덤값을 뽑는다. 그렇다면 시드값이 동일하면 rand값도 동일하니, 내 컴퓨터에서의 seed와 서버에서의 ..

    [Pwnalbe] 1996

    오늘은 1996이라는 문제를 풀어볼거다. 굉장히 쉬운 문제였던거 같다. NX bit가 enabled 되어 있고 partial relro가 걸려있어 _DYNAMIC 섹션에 write 권한이 없다. 바로 아이다로 열어보자 c++ 바이너리이다. 우선 "Which environment variavle do you want to read"라는 문자열을 출력해주고 getenv로 name에 입력을 받는다 하지만 getenv에서 length check를 해주지 않으니 BOF가 터질거 같다. 취약점은 파악했으니 어떤 방식으로 익스를 해야될지를 생각해봐야된다. 위에서 이 문제가 어렵지 않다고 한 이유가 쉘을 띄워주는 함수가 내장되어 있다. 그럼 익스 코드를 쉽게 구상할 수 있다. buf [0x410] + SFP [0x8]..

    [Reversing] Handray

    이번에는 Handray 문제를 정리를 해보려 한다. 사실 난 이 문제를 거의 게싱으로 풀어서 나의 풀이가 도움이 안될 수도 있다. ELF파일을 실행시켜보면 "flag를 뛰어넘었습니다!" 라는 문자열과 함께 실행이 끝난다. 여기서 "뛰어넘었습니다!" 라는 문자열을 보고 나는 디스어셈블을 했을때 분기문을 잘 살펴봐야겠다고 생각했다. 바로 main 함수를 보자 19번째 줄에서 분기가 이루어진다. 분기되기 전 줄에 bp를 걸고 실행시켜보자 rbp - 0x4에 0이라는 값이 들어있는지 비교를 한다. 그럼 rbp - 0x4에 0으로 값을 세팅을 해주자 그리고 continue 시키면 플래그가 나온다! FLAG = HackCTF{HotToHanDleC0ldT0H000ld!} 어려운 문제가 아니니 쉽게 풀 수 있다 :D..

    [Pwnable] Poet

    오늘은 poet 문제를 풀어볼라 한다. poet 문제는 200점대 문제치고는 그리 어렵지 않았다. 그냥 코드 분석만 잘하면 풀만한 문제였다. NX bit만 enable 되어 있으며 Partial RELRO가 걸려있다. 실행을 시키면 입력을 받으면 1000000점을 채우라며 다시 시도하라 그런다. 하나하나 살펴보자 우선 get_poem(), get_author(), rate_poem()을 순서대로 실행시키며 dword_6024E0이 1000000이 된다면 while문을 탈출함과 동시에 reward()로 들어간다. dword_6024E0이 아까 실행시켰을떄 score을 의미하는것 같다. get_poem부터 살펴보자 result에 poem에 입력받은 값을 대입한다. poem은 bss 영역에 위치해있다. 그리고..