Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking 31

HackCTF ROP Write-up

이번엔 Return Oriented Programming(반환 지향 프로그래밍)에 대한 문제를 풀어보겠다. 우선 ROP라는 것은 ASLR과 NX bit가 걸려 있는 바이너리라는 의미인데, 한번 checksec로 확인해보자! 적중했다. NX bit는 걸려 있는 것을 확인했다! 그럼 IDA로 코드를 보자. 보니 vulnerable_fuction, 즉 취약점 함수가 존재한다. 한번 보자. 캬.... 너무나도 깔끔해서 취한다~ read 함수로 buf에 입력받는다! BOF도 터진다! 그런데 printf가 없어서 인자가 3개인 write 함수를 써야 한다.... 따라서 가젯도 pop pop pop ret를 찾아야 한다. ㅠㅠ 바아아아~로 찾았다! pop pop pop ret = 0x8048509 이번엔 libc의 ..

Hacking/HackCTF 2020.01.14

HackCTF pwning Write-up

이번에는 pwning 문제를 풀어보겠다. 췤쉨췤쉨췤쉑 음 평범한 NX Partial RELRO 문제이다. IDA로 코드 분석해보자. 우선 main에서는 vuln 함수를 호출한다. vuln 함수는 입력하고 싶은 문자열의 길이를 입력한 후 조건을 만족하면 nptr에 입력할 수 있는 함수 같다. 그런데, 입력할 때 일반적인 gets를 사용하지 않고 get_n이라는 함수를 거쳐 받는다. 어떤 취약점이 있을지 한번 get_n을 보자. 보니 a1이라는 주소부터 v5를 증가시키면서 하나하나씩 대입하는 것을 볼 수 있다. 그런데.... 함수의 두 번째 인자는 unsigned int, 즉 부호 없는 int형이었다!! 따라서 우리는 첫 번째 입력을 할 때 -1을 입력한다면, vuln 함수에서 v2=-1이 되어 if문을 통..

Hacking/HackCTF 2020.01.14

HackCTF Beginner_Heap Write-up

어제부터 힙에 관한 기본 지식과 메모리 구조에 대해 공부해 봤는데, 이를 바탕으로 Beginner_Heap 문제를 풀어보겠다. 우선은 heap 문제이든 stack 문제이든 checksec이 국룰이다. 보니까 Partial RELRO와 NX bit가 적용되어 있다. 즉, GOT overwriting은 가능하나 쉘 코드 사용이 불가능하다. 우선 어떤 코드인지 IDA로 보자. 오.... 역시 heap 문제답게 동적 할당이 나온다... 무섭지만ㅜㅜ 한번 분석해보자. 그런데, 너무 main이 더럽다. 깔끔하게 볼 수 없을까? 당연히 방법은 존재한다. 키보드의 '|'와 '\'가 있는 버튼을 누르면! 자료형이 보이지 않게 된다! 아무튼... 분석 시작해보자. - - - - - - - - - - - - - - - - ..

Hacking/HackCTF 2020.01.13

HackCTF gift Write-up

이번엔 gift 문제를 풀어보겠다. 우선 바이너리부터 checksec 해보겠다. 이번엔 RELRO도 없다. NX bit는 기본으로 활성화되어 있다. 그럼 IDA로 바이너리를 까 보자. 보니까 binsh의 주소와 system의 주소를 전부 다 주고 fgets로 s에 입력을 받은 뒤, 다시 한번 출력 후 입력을 받는다. 그런데 binsh에는 아무 값도 없는 것을 보아 내가 직접 저 부분에 "/bin/sh"을 집어넣어야 한다는 것을 알게 되었다. 굳이 안 넣고 그냥 libc에 있는 binsh 문자열 주소를 가져올 것이다. fgets에서는 128byte를 입력받을 수 있지만, gets에서는 길이 제한이 없다. 따라서 gets에서 BOF를 터뜨릴 것이다. 앞의 fgets에서는 아무거나 넣고, 앞에서 system의..

Hacking/HackCTF 2020.01.08

HackCTF Look at me Write-up

이번에는 '나를 봐!' Look at me 문제를 풀어보겠다! 우선 바이너리를 checksec 해보자. 보니까 NX bit만 걸려 있다. 따라서 쉘 코드만 사용 불가능하다. 이번엔 IDA로 문제 코드를 분석해보자. 보니까 main에서 look_at_me 함수를 호출하고, gets로 v1을 받아 오는 것 같다. 그런데..... 함수의 개수가 923개인 것을 보니 평범한 바이너리는 아닌 듯하다. 왜 그런지 리눅스의 file 명령어를 통해 알아보자. 많은 바이너리가 dynamically linked로, 실행 파일 안에 모든 함수가 들어가 있는 것이 아닌, 외부 라이브러리를 연결하여 불러오는 방식을 사용하여 파일 크기가 그렇게 크지 않다. 그러나 이 statically linked 파일은 필요한 모든 함수가 바..

Hacking/HackCTF 2020.01.08

HackCTF RTL_Core Write-up

Return to Libc 문제인데, Core이 붙어 있다. 무슨 문제인지 궁금하다. 확인해보자. 이번에는 zip 파일을 주었다. 아마도 libc 파일도 주는 것 같다. checksec부터 해보자. RTL을 사용할 수 있도록 NX bit만 설정되어 있는 상태다. IDA로 코드를 확인해보자. 보니까 check_passcode의 리턴 값과 hashcode가 같으면 core 함수를 호출한다. hashcode는 0xc0d9b0a7이다. 그럼, 다음으로 core 함수를 보자. 보니까 printf의 주소를 주고, read 함수로 BOF를 일으킬 수 있다. 그렇다면, 먼저 check_passcode 함수를 봐야겠다. 우선 i는 0부터 4까지 돌리는 것을 보니 for문은 5번 돌아간다. 안쪽을 보자. v2에 4byte..

Hacking/HackCTF 2020.01.07

HackCTF Random Key Write-up

이번에 Random Key 문제를 풀어보겠다. 우선 checksec부터 해보자. 기본적으로 64bit 기반의 바이너리이고, NX bit가 걸려 있다. 한번 IDA로 코드를 봐보자. 아무래도 내가 입력한 값과 랜덤으로 생성되는 값이 일치해야 flag를 주나 보다. 우선 지금까지 문제 중에 보지 못한 srand 함수와 rand 함수가 있다. 그런데 srand(v3)를 보니 rand의 시드가 현재 시간으로 정해져 있다는 것을 알 수 있다. 따라서 같은 시간대에 또 다른 프로그램을 실행해도 시스템의 현재 시간을 가져온다. v5의 값이 rand()이지만 같은 시간에 아무 c언어 프로그램에서 rand()를 출력했을 때 보이는 값이 v5의 값과 같은 것이다. 따라서 나는 C언어 프로그램을 작성하여 이 문제를 해결하였..

Hacking/HackCTF 2020.01.07

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