Try to be the expert.

Ainsetin's Hacking & PS & Math

HackCTF 20

HackCTF poet Write-up

이번엔 시인이 되는 건가보다. 한번 풀어보자. 문제 풀이 시작! 우선 checksec부터.... 전 문제처럼 NX bit가 걸려 있다. 바이너리 IDA로 까보자!! 흠... 내가 시를 작성하고 이름을 입력하면 점수를 주는가보다.... 한번 세부적인 함수를 살펴보자! 이 부분은 poem이라는 전역 변수에 입력을 받는 곳이다. 이 부분은 시인의 이름을 받는 곳이다. 그렇게 의미는 없다. 이 부분이 중요하다. 왜냐하면 점수에 직결되기 때문이다. strtok으로 띄어쓰기나 \n을 인식해 한 단어씩 비교하는데, 그 문자열이 나와있는 8개의 단어 중 하나이면 100점을 추가한다. 그런데..... dest는 410h라 큰 것 같지만 10진수로 바꾸면 1000000점에는 입력 만으로 절대 도달할 수 없다는 것을 알 수..

Hacking/HackCTF 2020.01.07

HackCTF g++ pwn Write-up

이번엔 C++로 작성된 바이너리인 듯하다. 한번 도전해보자. checksec부터 해보자. NX bit만 걸려있는 것을 볼 수 있다. 왜 g++ 컴파일러인지는 IDA로 까보면 알 수 있다. 보는 것과 같이 std::string같은 c++ 문법이 있는 것을 확인할 수 있다. 하지만 여기서 필요한 부분만 가져오면 된다. 우리의 목적은 get_flag 함수를 실행시켜 flag를 획득하는 것이다. 이 바이너리를 디스어셈블한 결과로 보면 더 쉽게 이해할 수 있다. 여기서 중요한 부분은 fgets의 인자이다. 20h, 즉 32byte를 입력받고 마지막에 길이 제한 없이 strcpy를 한다. 그런데 문자열 s는 3Ch, 즉 60byte 뒤에 SFP, RET가 존재하는 것이다. 그러면 BOF가 안될 텐데....? 그런데..

Hacking/HackCTF 2020.01.07

HackCTF RTL_World Write-up

아까 전에 작성한 Yes or no가 너무 난해해서 이번 문제는 쉽게 풀 듯하다. 문제 풀이 스타트! RTL 문제이다. world가 붙어있는 것을 보니 간단하거나 전형적인 RTL은 아닌듯하다. 우선 checksec부터 해보자. NX만 걸려있는 것을 보니 RTL을 사용할 수 있다는 것을 알 수 있다. 바이너리를 IDA로 까보자. 이 문제에서는 6번까지의 메뉴를 선택할 수 있고, 5번에서 BOF attack을 할 수 있다. 2번으로 돈을 벌거나 3번, 4번으로 system과 binsh의 주소를 알 수 있긴 하다. 하지만 system의 plt값이 고정되어 있고, Shift + F12를 눌러서 문자열 검색을 해보니 /bin/sh이 고정 주소에 있는 것을 알 수 있다. 따라서 우리는 system_plt=0x804..

Hacking/HackCTF 2020.01.06

HackCTF Simple_Overflow_ver_2 Write-up

문제 풀이 스타트!! 이번에는 버전 2란다.... 뭐 그래도 많이 달라진건 없겠지... 스타트! checksec 확인부터 해보자. 전 문제와 같이 깔ㅡ끔하다. 그럼 IDA로 디컴파일해보자. 이번에는 코드 분석이 필요할 것 같다. 간단하게 말하자면, Data 문자열을 받은 뒤 s의 주소를 출력하고 그 문자열을 공백 하나하나 붙여서 출력해주는 프로그램이고, Again을 통해 다시 시도할 수 있다. buffer의 주소를 출력하는 것 같아 이번에도 nc 서버에 접속해보았다. 예상한대로 buf의 주소가 달라지는 것을 알 수 있다. 그러나 Again을 해도 달라지지 않았다. 따라서 먼저 아무 값이나 집어넣고 buffer 주소를 leak한 후에 payload를 입력하면 될 것이다. exploit code는 다음과 같..

Hacking/HackCTF 2019.12.23

HackCTF x64 Simple_size_BOF Write-up

x64 기반의 두번째 문제이다. 이번에는 버퍼의 크기가 작거나 매우 크게 주는가보다. 뭐 그래도 풀리긴 할거니까... 도전! 우선 checksec부터 해보자. 깔ㅡ끔 그자체이다. 이번엔 IDA로 바이너리를 까보겠다. 간단하다. s 출력 후 buf의 주소를 알려준 뒤, gets로 그곳에 어떤 값을 넣나보다. 그런데, 문제가 있다. system 함수를 불러오기 위한 함수가 존재하지 않는다. 하지만 걱정하지 마라, (손은 눈보다 빠르니까) 버퍼의 크기가 워낙 크므로 64bit를 기반으로 한 쉘코드를 buffer에 집어넣는 것이 좋을듯 하다. 우선 31byte 크기의 64bit 쉘코드를 찾았다. "\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f..

Hacking/HackCTF 2019.12.23

HackCTF x64 Buffer Overflow Write-up

이번에는 64bit 기반의 바이너리 문제를 풀어보도록 하겠다. 일단 보호 기법부터 확인하자. Full RELRO가 걸려 있고, NX bit가 걸려 있는것을 보니 RET 변조만 가능할 것 같다. 즉, 기본적인 x64 BOF인 것이다. 64bit 기반에서는 SFP와 RET가 각각 8byte로 이루어져 있는것 빼고는 32bit 기반과는 거의 똑같다. IDA로 코드부터 보자. s의 크기가 0x110=272byte이고 SFP 8byte를 더미로 넣으면 된다! 문제는, system함수를 실행시키는 것이 필요한데... 그런데 함수 목록을 보니 callMeMaybe라는 함수를 볼 수 있었다...!! 딱보니 쉘을 실행시키는 함수였다...!! 이 함수의 주소는 0x400606이고 RET에 이 주소를 넣으면 될 것이다. e..

Hacking/HackCTF 2019.12.23

HackCTF 내 버퍼가 흘러넘친다!!! Write-up

오늘은 Pwnable 3번째 문제, "내 버퍼가 흘러넘친다!!!"를 풀어보겠다. 우선 바이너리를 체크하니 아무것도 걸려 있지 않았다. 따라서 쉘코드를 충분히 사용할 수 있고, RET 변조가 가능하다. read 함수와 gets 함수가 있는데, 함수의 에필로그까지 간 다음 RET가 존재하므로 gets에서 BOF를 일으키면 된다. 그런데 s의 크기가 20byte밖에 되지 않아 쉘코드를 저장할 수 없다. 따라서 버퍼에 더미값을 넣고 쉘코드를 버퍼 밖에 저장한 뒤, RET를 변조하여 쉘코드 주소를 가리키게 하면 flag를 획득할 수 있을 것이다. 우선 gdb로 stack을 활용하기 위한 준비 과정을 거쳐보자. gets 다음 main+78에 break를 걸면 될 것이다. 0x41부분은 buffer이고, 0x42부분..

Hacking/HackCTF 2019.12.23

HackCTF Basic_FSB Write-up

이름만 봐도 포맷 스트링 공격을 해야 할 것 같은 비주얼이다. 그럼 풀이 시작해볼까...! checksec으로 확인하니 전혀 문제될 것이 없었다. 그럼 IDA로 까보도록 하겠다. vuln함수를 호출하는 것을 볼 수 있다. 그럼 들어가 봐야지! 보니까 snprintf로 format에 s의 내용을 복사하는 것 같았다. 진짜는 return줄이다. printf의 인자에 format의 주소가 있고, 다른 인자는 없다. 이때 사용하는 공격 기법을 FSB(Format-String Bug)라고 한다. F S B (Format-String Bug) printf에는 다양한 출력 포맷이 있다. %d, %s, %c, %f, %n 등이 존재한다. 그런데 우리가 기본적으로 보는 printf 함수의 사용법은 " printf("%d..

Hacking/HackCTF 2019.12.22

HackCTF Basic_BOF #2 Write-up

가즈아!! 이번엔 Basic_BOF #2를 풀어보겠다. binary의 보호 기법을 확인하니, 전 문제와 똑같이 NX가 걸려 있는 것을 볼 수 있다. 이 말은 쉘코드를 사용할 수 없다는 의미이기도 하다. 그럼 IDA로 까보자. 이번엔 main을 까 봤더니 그냥 sup함수를 호출하고 s를 입력받고 v5를 실행하는 간단한 함수였다. sup 함수는 그냥 s를 출력하는 함수였다.. shell 함수도 존재해서 디컴파일 해보았다. system 함수를 호출하는 함수이다!! 따라서 우리는 BOF를 일으켜 RET 변조를 해야 한다. 그런데 s의 크기는 16진수 8C, 즉 140byte이다... fgets에서 133byte밖에 입력을 못하기 때문에 RET 변조는 불가능하다. 결정적인 것은,, main에서 v5가 sup 함수..

Hacking/HackCTF 2019.12.22

HackCTF Basic_BOF #1 Write-up

HackCTF의 Pwnable 첫 번째 문제 Basic_BOF #1 문제를 풀어보겠다. 우선 binary가 주어져 있으므로 IDA로 까 보도록 하겠다. main을 디컴파일한 결과를 보기 위해 F5번을 누르면 이런 창이 뜬다. 코드를 보면, 정체불명의 v5값이 주어져 있고 비교를 하여 쉘을 딸 수 있는 기회를 제공한다. if문에 있는 규칙도 안보이는 저 세 숫자는 뭘 뜻하는 걸까? IDA에서는 숫자를 char나 hex, 8진수 체계로 변환할 수 있다. 저 숫자를 클릭하고 'H'키를 누르면...! 뭔가 의도적으로 넣은 듯한 글자가 보이기 시작한다!! 결론은, 우리는 Stack Buffer Overflow를 일으켜 v5의 값을 변화시켜야 한다. 실행하고 난 후 stack을 까 보도록 하자. 그런데, gdb를 ..

Hacking/HackCTF 2019.12.22