Try to be the expert.

Ainsetin's Hacking & PS & Math

bof 15

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 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 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 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