Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF 24

HackCTF 1996 Write-up

이번엔 내가 제일 쉽게 풀었던 1996 문제를 풀어보겠다. 우선 1996 바이너리부터 checksec 해보자. 64bit 기반의 쉘 코드 사용이 불가능한 바이너리인 것을 알 수 있다. IDA로 무슨 프로그램인지 디컴파일해보자. 이 main은 g++ pwn 문제처럼 C++ 기반으로 작성되었다. 그러나 걱정할 필요 없다. name을 cin으로 받기 때문에 길이 제한이 없다. 따라서 0x410+8byte만큼 dummy를 채우고 RET 자리에 spawn_shell(void) 함수의 첫 주소를 주면 된다. 이 함수의 첫 주소는 0x400897이다. exploit code를 작성해보자. 실행시켜보면....! flag가 나오는 것을 볼 수 있다.

Hacking/HackCTF 2020.01.07

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 Yes or no Write-up

Yes or no 문제를 해결해보겠다. 이번에 주어지는 파일은 zip 파일이다. 파일이 한 개가 아닌가 보다. 우선 checksec부터 해보자. 쉘 코드만 사용하지 못하도록 되어 있다. 다음, 바이너리를 까 보자. 보니 main함수에서 gets함수를 실행시키는 것이 목표인 듯하다. 그렇다면 gdb로 디버깅하면서 34번째 줄의 if문을 만족하도록 v10값을 찾으면 문제를 풀 수 있을 것이다. main+237줄에서 gets를 호출할 수 있도록 하는 조건인 cmp가 있는 것을 알 수 있다. 따라서 저 부분에 break를 걸고 v10에 임의의 값을 집어넣어 run을 해보겠다. 이 바이너리는 64bit 기반이므로 rax값은 곧 eax값이다. 여기서 [rbp-0x8]에 들어있는 값과 eax의 값을 비교하므로 입력해..

Hacking/HackCTF 2020.01.06

HackCTF BOF_PIE Write-up

이번엔 Buffer OverFlow PIE 문제를 풀어보겠다. PIE가 걸려 있을 것 같지만, 우선 checksec부터 해보자. NX bit와 PIE가 걸려 있는 것을 확인할 수 있다. NX bit는 쉘 코드 실행을 막는 보호 기법이다. 이 문제에서 절대적으로 중요한 보호기법은 PIE 기법이다. PIE 기법이란, 함수를 실행할 때마다 호출할 주소가 고정되어 있는 것이 아닌, 상대 주소를 호출하여 한 번의 단계를 더 거쳐서 다른 함수를 호출하는 것이다. 예를 들어, main함수를 디스어셈블할 때 일반적으로 0x8000xxxx와 같은 주소가 아니라 0x100 같은 아주 작은 주소로 바뀌게 된다. 이 보호 기법을 우회하기 위해서 memory 주소를 leak 하거나 ROP 기법을 활용할 수 있다. 우선 바이너리..

Hacking/HackCTF 2020.01.06

HackCTF offset Write-up

offset 문제는 뭔가 새롭다. 한번 도전해보자. 우선 바이너리 보호 기법부터 살펴보자. 와우.... 지금까지 보지 못한 장면이다. 대표적인 보호 기법이 거의 다 걸려 있다. 즉 우리는 직접 Code, Stack, Data 영역을 실행할 수 있는 권한뿐만 아니라 RET 변조, 쉘 코드 사용까지 전부 다 막혔다는 뜻이다. 다시 말해, 건드릴 수 있는 부분이 한정적이라는 뜻이다. 우선 단서를 찾기 위해 IDA에서 이 바이너리를 파헤쳐보았다. 요약하자면, s 문자열을 받아 select_func 함수에서 이 문자열이 "one"이면 one 함수를 return하고 아니면 two 함수를 return 하는 프로그램이다. 특징으로는 Basic_FSB문제처럼 return에 함수 이름이 들어가는데, 함수 이름이 곧 주소(..

Hacking/HackCTF 2019.12.29

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