본문 바로가기

분류 전체보기

(62)
[ProjectH4C] HackCTF (1996) 1996을 실행하면 다음과 같다. 코드부터 확인해주도록 한다. int __cdecl main(int argc, const char **argv, const char **envp) { __int64 v3; // rdx __int64 v4; // rax __int64 v5; // rdx __int64 v6; // rbx char *v7; // rax __int64 v8; // rdx __int64 v9; // rax char name; // [rsp+0h] [rbp-410h] std::operator(&std::cin, &name); v4 = std::operator
[ProjectH4C] HackCTF (poet) int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { const char *v3; // rdi setvbuf(_bss_start, 0LL, 2, 0LL); v3 = s; puts(s); while ( 1 ) { get_poem(v3, 0LL); get_author(v3); rate_poem(v3); if ( dword_6024E0 == 1000000 ) break; v3 = asc_400D78; puts(asc_400D78); } reward(v3); } __int64 get_poem() { __int64 result; // rax printf("Enter :\n> "); result = gets(poem); dword..
[ProjectH4C] HackCTF (g++ pwn) gpwn 파일을 다운받아 코드를 확인해보면 다음과 같다. 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+40h] [ebp-18h] char v5; // [esp+47h] [ebp-11h] char v6; // [esp+48h] [ebp-10h] char v7; // [esp+4Fh] [ebp-9h] printf("Tell me s..
[ProjectH4C] HackCTF (RTL_World) RTL_World 파일의 코드는 다음과 같다. int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // [esp+10h] [ebp-90h] char buf; // [esp+14h] [ebp-8Ch] void *v6; // [esp+94h] [ebp-Ch] void *handle; // [esp+98h] [ebp-8h] void *s1; // [esp+9Ch] [ebp-4h] setvbuf(stdout, 0, 2, 0); handle = dlopen("/lib/i386-linux-gnu/libc.so.6", 1); v6 = dlsym(handle, "system"); dlclose(handl..
[ProjectH4C] HackCTF (BOF_PIE) 해당 파일을 실행하면 다음과 같이 나온다. j0nghyun의 주소를 알려주는데, 주소가 실행될 때마다 바뀐다. checksec를 통해 설정된 보호기법을 확인해보면 다음과 같다. 위처럼 매번 실행할 때마다 주소가 바뀌는 이유는 PIE가 설정되어 있기 때문이다. PIE (Position Independent Executable) 위치 독립 코드로 이루어진 실행 가능한 바이너리를 뜻한다. 위치 독립 코드란 말은, 실행될 때마다 매핑되는 주소가 어디든 상관없이 실행되는 파일이라는 뜻인데, 실행될 때마다 주소를 랜덤하게 바꾸어서 특정 주소의 값을 변조하는 등의 공격을 보호하기 위해 사용된다. IDA를 이용해 코드를 보도록 한다. main에서 welcome 함수를 호출한다. welcome에서 문자열을 출력하고 입력..
[ProjectH4C] HackCTF (Offset) Offset의 코드는 다음과 같다. 처음에 Which function would you like to call? 이란 메세지가 출력된 후 입력을 받는다. 이후 입력 값을 select_func 함수의 인자로 넘겨서 실행시킨다. 만약 입력 값이 one 이라면 one 함수를 실행하고, 그렇지 않으면 two 함수를 실행시키는 듯 하다. 조금 더 살펴보면 offset에는 위의 함수 뿐 아니라 print_flag 함수도 존재한다. 말 그대로 flag를 출력해주는 함수이다. v3의 위치를 알아내서 one, two 함수가 아닌 print_flag 함수의 주소를 저장할 수 있다면, select_func 함수가 종료되면서 print_flag 함수를 호출하게 될 것이다. select_func 함수에서 strncpy가 실행되..
[ProjectH4C] HackCTF (Simple_Overflow_ver_2) 해당 프로그램은 값을 입력하면 해당 값이 저장되는 위치가 출력되면서 저장된 값을 바이트 단위로 구분해서 출력해주는 프로그램인 듯 하다. 먼저 IDA를 이용해 코드를 확인해보았다. 먼저 buf의 위치를 찾아보도록 한다. IDA를 보면 바로 알 수 있지만 그래도 gdb를 통해 확인해보도록 한다. 값을 입력받은 직후(main+88)에 중단점을 걸고 입력으로 "AAAAAAAAAAAAAA"를 넘겨보았다. ebp의 위치는 0xffffd138이고 A가 저장되기 시작한 위치는 0xffffd0b0이다. 이 둘을 빼주면 IDA에서와 동일하게 0x88이 나온다. 이는 10진수로 136이 되며, ebp 4바이트를 더해주면 140바이트가 된다. 페이로드는 다음과 같다. payload = "쉘 코드 25바이트" + "\x90"*..
[ProjectH4C] HackCTF (x64 Simple_size_BOF) nc ctf.j0n9hyun.xyz 3005에 연결하면 다음과 같은 화면이 나온다. 이후에 값을 입력받고 프로그램이 종료된다. 친절하게도 이번 문제에서는 buf의 시작 주소를 알려주지만, 문제가 있다. 보이는 것처럼 연결할 때마다 buf의 위치가 달라진다. 이처럼 실행할 때마다 스택의 위치가 고정되지 않고 임의로 바뀌는 보호기법을 ASLR (Address Space Layout Randomize) 기법이라 한다. IDA를 이용해 코드를 확인하면 다음과 같다. 출력함수 부분에 %p에 v4의 주소가 들어가는 것으로 보아 v4가 buf가 될 것이다. 또, v4는 0x6d30 크기만큼 할당받는다. 크기는 충분하니 쉘 코드를 buf에 넣어 실행시키면 될 듯 하다. 페이로드는 다음과 같다. from pwn impo..