Wargame/HackCTF

    [HackCTF] g++ pwn 풀이 (200p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 먼저 gpwn을 실행해보자. 문자열 하나를 받고, 그대로 출력하는 건가? IDA로 슈도코드를 확인해보자. int __cdecl main(int argc, const char **argv, const char **envp) { vuln(); return 0; } main 함수에서는 바로 vuln 함수를 실행한다. int vuln() { const char *v0; // eax char s; // [esp+1Ch] [ebp-3Ch] char v3; // [esp+3Ch] [ebp-1Ch] char v4; // [esp+..

    [HackCTF] RTL_World 풀이 (200p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 먼저 rtl_world를 실행해보자. 아! 참고로 64bit linux로 실행하면 Segmentation fault가 뜬다. 호오.. System Armor와 Shell Sword를 갖고 있으면, Binary Boss를 죽일 수 있다고 한다. 대충 system 함수의 인자로 /bin/sh을 넘겨 문제를 푸는 방식인듯? IDA로 슈도코드를 확인해보자. 중요한 부분만 적도록 하겠다. Main Pseudocode char buf; // [esp+14h] [ebp-8Ch] case 5: printf("[Attack] > "..

    [HackCTF] Yes or no 풀이 (150p)

    풀이 dreamhack에서 기본적인 포너블 문제를 풀고왔다. 이제 다시 HackCTF pwnable, wargame WriteUp을 작성해보려고 한다. Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) Yes or no 파일을 먼저 실행해보자. 단순하게 숫자를 물어보는 프로그램이다. IDA로 열어 슈도코드를 확인해보도록 하겠다. int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax int v4; // eax int v5; // ecx int v6; // eax int v7; //..

    [HackCTF] Pwnable 후기

    ^--^ 역시 포너블은 어렵다. 다른 사이트에서 기초적인 문제를 풀고 기본 개념들을 완벽히 숙지한 담에, 건드려보는게 좋을 거 같다고 판단했다. Write-up을 보는건 아무런 의미가 없으니까 ^^..

    [HackCTF] BOF_PIE 풀이 (150p)

    문제 종류 - Pwnable 사용한 툴 - IDA nc ctf.j0n9hyun.xyz 3008 풀이 일단 IDA로 파일을 열어보자. 수상해 보이는 2개의 함수가 있다. 일단 main부터 봐보도록 하자. main에서는 welcome 함수를 호출하고 프로그램을 종료한다. 이번 문제는 main이 주가 아닌가 보다. welcome 함수에서는 j0n9hyun의 주소 값을 출력하고 scanf로 값을 하나 받는다. 일단 scanf에서 bof가 일어나는 듯하다. j0n9hyun 함수는 flag를 출력해주는 함수다. 그런데 문제를 보면, PIE라고 적혀있다. PIE는 메모리 보호 기법 중 하나로, binary가 랜덤한 주소를 갖게 된다. 그래서 프로그램에서 출력해주는, 주소로 공격을 시도하면 당연히 페이로드가 동작하지 ..

    [HackCTF] Offset 풀이 (150p)

    문제 종류 - Pwnable 사용한 툴 - IDA nc ctf.j0n9hyun.xyz 3007 풀이 IDA에 파일을 넣어보자. main 함수 부분이다. gets로 s를 입력받고, select_func 함수에 s를 넘겨준다. select_func 함수는 포인터 함수 v3에 two를 일단 넣고, src를 복사한 dest가 one이면 one을 리턴, one이 아니면 two를 리턴한다. 여기서 리턴 함수가 one, two가 아니라 print_flag라는 함수라면? 이제 gdb를 실행해보자. select_func 끝 부분에서 eax를 call 한다. eax에는 함수의 반환 값이 저장되는데, 이 부분에 bp를 걸고 eax 값을 확인하자. 이 값을 입력한 값이 저장되어 있는, ebp-0x2a 근처에서 찾아보도록 하자..

    [HackCTF] Simple_Overflow_ver_2 풀이 (150p)

    문제 종류 - Pwnable 사용한 툴 - IDA nc ctf.j0n9hyun.xyz 3006 풀이 파일을 IDA로 열어보자. 쉘을 여는 함수가 따로 없는거 봐서는, main 함수에서 bof가 발생하는 듯하다. C로 보기 좋게 옮기면.. 이렇다. #define _CRT_SECURE_NO_WARNINGS #include int main() { int v3; //i char v5; //Again 결정 변수 char s[128]; //Data 입력 변수 int i; v5 = 121; do { printf("Data : "); if (scanf(" %[^\n]s", s)) { for (i = 0;; ++i) { v3 = i; if (v3 >= strlen(s)) break; if (!(i & 0xF)) prin..

    [HackCTF] x64 Simple_size_BOF 풀이 (150p)

    문제 종류 - Pwnable 사용한 툴 - IDA nc ctf.j0n9hyun.xyz 3005 풀이 pwn 패키지 가끔 헷갈려서 또 삽질했네... ^---^ 우선 IDA로 열어봅시다. main 함수에서 gets 함수를 사용해 bof를 발생시킵니다. 쉘 함수가 없는거로 봐서는, 직접 쉘 코드를 작성해야 합니다. 이제 gdb로 열어봅시다. 이번에는 좀 큰 사이즈인 0x6d30(27952)칸을 할당받는다. x64 환경이니, 쉘코드 + 더미 값 + RET 페이로드를 작성해 쉘을 열어보자. 난 31byte 쉘 코드를 사용했기 때문에 쉘코드(31) + 더미(27929) + RET(6)칸을 적어주면 될 듯하다. RET의 사용될 buf의 시작 주소는, 프로그램을 실행하면 다음과 같은 형식으로 알려준다. buf의 주소가..