Try to be the expert.

Ainsetin's Hacking & PS & Math

pwnable 20

HackCTF Unexploitable #1 Write-up

이번엔 기본 RTL 문제를 풀어보겠다. 우선 보호 기법부터 확인하자. 보니까 평범하게 컴파일된 바이너리이다. NX bit만 설정되어 있는 것을 볼 수 있다. IDA로 코드를 보자. 우선 64byte 입력에 s의 크기가 16byte이므로 BOF가 가능하다. 보니까 easy RTL 이라고 되어 있다. 왜 그런지 확인해보자. 여기서 system을 호출하므로 call 할 때의 주소를 RET에 집어넣으면 되겠다. 문제는 "/bin/sh"문자열을 구해야 한다는 것인데, 어디선가 "sh"라고만 쳐도 쉘이 실행되는 것을 본 적이 있었다. 일단 Shift+F12로 문자열 검색을 해보았다. 보니까 fflush 문자열이 있는 것을 확인할 수 있었다. 따라서 그냥 's'의 주소를 찾아 "sh" 문자열을 읽어낼 수 있다. 알파..

Hacking/HackCTF 2020.02.20

HackCTF You are silver Write-up

오랜만에 hackctf 라업을 작성하는 것 같다. Format String Bug를 제대로 공부하고 와서 그런지 이번 문제도 어렵지 않게 풀 수 있을 것 같다. 그럼 문제를 풀어보자!! checksec부터 시작!! 평범하게 컴파일 된 바이너리이다. GOT overwriting을 할 수 있다. 그럼 IDA로 한번 보자. 보니까 s에 46byte 크기를 입력할 수 있고, 그것을 printf로 그냥 출력한다. 따라서 FSB 문제라는 것을 알 수 있다. 문제의 구성은 get_tier함수를 실행하고 난 리턴 값을 출력해 주는 것으로 간단하다. 보니까 main에서 가져온 v6값을 전제로 티어를 정해주는 것을 알 수 있었다. 그런데 main에서 호출되지 않은 함수가 존재하였다!! 이것은 인자가 4라면 flag를 출력..

Hacking/HackCTF 2020.02.17

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