System hacking training
-
TLSv00 write upSystem hacking training/pwnable.xyz 2020. 5. 4. 17:18
바이너리에 모든 메모리 보호기법이 적용되어있다. TLSv00을 풀이하기 위해서는 각각의 기능에 대해 조금은(?) 자세하게 알고있어야한다. int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int idx; // eax@2 int size; // ST0C_4@9 setup(); puts("Muahaha you thought I would never make a crypto chal?"); generate_key(63u); while ( 1 ) { while ( 1 ) { while ( 1 ) { print_menu(); printf("> ", argv); idx = read_int32(); if ( idx != 2 ) ..
-
Free Spirit write upSystem hacking training/pwnable.xyz 2020. 4. 4. 19:46
int __cdecl main(int argc, const char **argv, const char **envp) { char *v3; // rdi@2 signed __int64 i; // rcx@2 int idx; // eax@5 int result; // eax@19 __int64 v7; // rdx@19 __int64 v8; // [sp+8h] [bp-60h]@15 void *ptr; // [sp+10h] [bp-58h]@1 char buf; // [sp+18h] [bp-50h]@2 __int64 v11; // [sp+48h] [bp-20h]@1 v11 = *MK_FP(__FS__, 40LL); setup(); ptr = malloc(0x40uLL); while ( 1 ) { while ( 1 )..
-
two targets write upSystem hacking training/pwnable.xyz 2020. 2. 6. 07:05
64bit, dynamically linked된 바이너리이며 Partial RELRO, NX, Canary가 걸려있다. 문제 이름과 같이 해당 바이너리를 통해 flag를 얻을 수 있는 방법은 2가지다. 먼저 4번 메뉴로 auth()함수를 호출하고, 해당 루틴을 맞추는 경우가 있고 두번째로 바이너리의 buffer overflow 취약점을 이용하여 got overwrite하는 경우가 있다. 첫번째 방법을 통해서 flag를 얻기에는 분석하는 과정이 조금 복잡할 것 같아서 buffer overflow를 이용한 got overwrite로 문제를 풀이할 수 있었다. 취약점은 2번 메뉴의 input에서 24byte 입력할 수 있다는 점과 3번 메뉴에서 해당 포인터에 값을 쓸 수 있다는 점을 이용하여 트리거 할 수 있..
-
xor write upSystem hacking training/pwnable.xyz 2020. 2. 5. 23:21
보호기법으로는 Full RELRO, NX, PIE가 걸려있다. main()함수에서 무한 루프를 돌며 v4, v5, v6에 %ld(long)으로 입력받는다. 이후 if문에 의해 각 입력값이 0이 아니고, v6이 9보다 작고, scanf()의 return 값인 v3가 3일 경우에만 result[v6] = v5 ^ v4가 실행된다. 또한 flag를 출력해주는 win()함수가 존재한다. 앞서 봐왔던 문제들과 비슷하지만 Full RELRO가 걸려있기 때문에 got overwrite를 할 수 없다. 하지만 위와 같이 코드 영역에 w(write)권한이 있기 때문에 result[v6] = v5 ^ v4을 통해 코드 패치가 가능하다. 따라서 v6으로 result를 기준으로 패치할 코드 위치를 조절하고, v4, v5를 x..
-
note write upSystem hacking training/pwnable.xyz 2020. 1. 10. 20:03
다소 easy한 문제다. 이젠 32bit 바이너리가 나오면 신기할것 같다. 역시 64bit 바이너리, Canary와 NX만 활성화 되어있다. main()함수를 보면 while로 무한루프를 돌며 read_int32()함수의 return값에 따라 edit_note(), edit_desc()함수가 호출된다. print_menu()함수는 단순하게 루프 한번 돌때마다 menu를 출력해주는 역할을 하고 read_int32()함수는 read()함수로 32byte 입력받은 뒤 atoi()함수로 char to int변환을 해주며 return하는 함수다. (즉 char형으로 32byte 받고 int형으로 return해주는 함수!) 해당 return값은 main()함수에서 menu를 고를 때 사용되고 menu 1을 선택할 ..
-
GrownUp write upSystem hacking training/pwnable.xyz 2020. 1. 2. 13:29
바이너리안에 flag가 있다고 한다. 64bit바이너리고, NX와 Canary, Partial RELRO가 걸려있다. 18살인지 물어보고, 맞다면 이름을 입력 받고 Welcome "이름"의 형태로 출력을 해주는 바이너리다. 또한 flag는 바이너리 내에 존재한다. (물론 서버에서 돌아가는 바이너리의 flag가 진짜 flag다.) 이 문제의 핵심이라고 생각되는건 strcpy()함수의 특징이다. line 21에 보면 앞서 src에 132byte 동적 할당한 공간에 name에 대한 정보를 128byte입력받는다. 그 후 strcpy()함수를 호출하여 usr에 복사를 한다. usr은 bss영역에 128byte할당되어있고, 0x6010E0 ~ 0x601160까지가 usr배열이다. usr의 일부 원소는 main()..
-
misalignment write upSystem hacking training/pwnable.xyz 2020. 1. 1. 18:49
pwnable.xyz 4번째 문제, 50점 배점이다. 64bit ELF 바이너리이며 모든 보호기법이 적용되어있다. add문제와 비슷하면서도 다른 문제다. 주된 차이점으로 add문제에서는 입력값이 연산되어 저장되는 배열이 __int64로 선언되어 한 공간에 8byte씩 할당이 되었는데, 이 문제에서는 char형으로 1byte씩 메모리 공간을 할당하여 사용하고 있다. 이 문제에서 flag를 얻기 위해서는 v6[7]에 0xB000000B5이 저장되어야한다. 앞선 문제와 동일하게 사용자 입력을 통해 사용자가 원하는 값을 세팅할 수 있지만 그 값을 넣을 수 있는 위치는 지정할 수 없다. 그 조건은 line 17과 같이 9보다 작거나 같고, -7보다 크거나 같아야한다. if : -7
-
add write upSystem hacking training/pwnable.xyz 2020. 1. 1. 13:30
멍청하게 got overwrite하려고 삽질(?)해서 시간 좀 날린 문제다. NX, Canary가 걸려있어 일반적인 쉘코드를 이용한 공격에 대한 대비가 되어있고, Partial RELRO가 걸려있어 got에 대한 쓰기 권한이 있어 overwrite가 가능하다. 해당 바이너리는 문제 이름 그대로 add를 해주는 기능만 구현이 되어있다. 또한 flag를 출력해주는 win()함수가 구현되어있다. 취약점은 main()함수에서 입력받은 두 수를 더하고, 해당 값을 저장하는 과정에서 발생하는데, v6을 통해 v7에서 ret에 도달할 수 있고, v4와 v5를 더한 값으로 해당 위치에 원하는 값을 저장할 수 있다. v7은 bp-0x60(Dec : 96)에 위치하며 ret에 도달하기 위해서는 v6을 13으로 세팅하면 된..