CTF
-
RTL_WorldCTF/HackCTF 2021. 1. 21. 21:07
Disassembly 디스어셈블리 main() 더보기 undefined4 main(void) { int32_t iVar1; char *pcVar2; int32_t *piVar3; int32_t var_90h; int32_t var_8ch; int32_t var_bp_ch; int32_t var_bp_8h; void *s1; setvbuf(_reloc.stdout, 0, 2, 0); var_bp_8h = 0; var_bp_8h = dlopen("/lib/i386-linux-gnu/libc.so.6", 1); var_bp_ch = dlsym(var_bp_8h, "system"); dlclose(var_bp_8h); s1 = (void *)var_bp_ch; while (iVar1 = memcmp(s1, "/..
-
Yes or noCTF/HackCTF 2021. 1. 21. 20:02
Disassembly 디스어셈블리 main() 함수의 초반부에서는 fgets(&str, 10, stdin)과 var_8h = atoi(&str)이 호출된다. 그 후에 eax에 각종 연산을 가하더니 eax==var_8h라면 gets(&str)을 호출하고, 그렇지 않다면 일부 출력문을 거친 후 함수가 종료된다. 따라서 var_8h가 eax와 같은 값을 가지도록 입력을 구성해야 gets()에서 발생하는 스택 버퍼 오버플로우를 활용할 수 있다. Condition eax==var_8h 어셈블리를 살펴보면 eax에 가해지는 연산이 외부 입력에 상관없이 항상 일정하다는 것을 알 수 있다. gdb를 통해 cmp 명령어 직전의 eax 값을 구하자. eax은 0x960000, 십진수로 변환하면 9830400이다. var_..
-
BOF_PIECTF/HackCTF 2021. 1. 21. 16:51
Disassembly 디스어셈블리 main()은 welcome()을 호출하고, Nach...를 출력한다. 따라서 welcome() 내에서 실행 흐름을 조작할 필요가 있다. welcome()의 주소를 출력한 뒤, var_12h에 문자열을 입력받는 함수이다. 따라서 스택 버퍼 오버플로우가 발생한다. PIE address leak 바이너리에 NX랑 PIE가 걸려있어 return address를 다른 함수의 주소로 덮는 데 제약이 생긴다. 따라서 PIE base address를 구할 필요가 있고, welcome()의 주소를 출력하는 부분이 있으므로 이를 바탕으로 다른 함수의 주소를 계산해줄 수 있다. p.recvuntil("j0n9hyun is ") welcome = int(p.recvline()[0:10], ..
-
OffsetCTF/HackCTF 2021. 1. 21. 04:11
Disassembly 디스어셈블리 undefined4 main(void) { int32_t unaff_EBX; char acStack47 [4]; char *s; undefined *puStack16; int32_t var_8h; puStack16 = &stack0x00000004; __x86.get_pc_thunk.bx(); setvbuf(**(undefined4 **)(unaff_EBX + 0x1801), 2, 0, 0); puts(unaff_EBX + 0x155); gets(acStack47); select_func(acStack47); return 0; } main()은 acStack47에 문자열을 입력받고 이를 인자로 select_func를 호출한다. void select_func(char *s..
-
Simple_Overflow_ver_2CTF/HackCTF 2021. 1. 21. 03:13
Disassembly 디스어셈블리 undefined4 main(void) { int32_t iVar1; uint32_t uVar2; uint32_t uVar3; int32_t *piVar4; int32_t var_89h; int32_t var_bp_8h; piVar4 = (int32_t *)0x0; setvbuf(_reloc.stdout, 0, 2, 0); var_89h._0_1_ = 'y'; do { printf("Data : ", piVar4); uVar2 = (int32_t)&var_89h + 1; iVar1 = __isoc99_scanf(" %[^\n]s", uVar2); if (iVar1 != 0) { var_bp_8h = 0; while( true ) { iVar1 = var_bp_8h; uV..
-
x64 Simple_size_BOFCTF/HackCTF 2021. 1. 21. 02:00
Disassembly 디스어셈블리 undefined8 main(void) { char *s; setvbuf(_reloc.stdout, 0, 2, 0); puts("삐빅- 자살방지 문제입니다."); printf("buf: %p\n", &s); gets(&s); return 0; } s의 주소를 출력하고, s에 입력을 받는 코드이다. Stack address leak p.recvuntil("buf: ") buf = int(p.recvline()[0:18], 16) 지역 변수 s의 주소는 스택 주소를 계산하는 데 사용할 수 있다. RET Overwrite 스택 버퍼 오버플로우를 이용해 쉘코드를 스택에 삽입할 수 있고, s의 offset을 바탕으로 계산한 쉘코드의 주소로 return address를 덮으면 문제..
-
x64 Buffer OverflowCTF/HackCTF 2021. 1. 21. 01:44
Disassembly 디스어셈블리 undefined8 main(undefined8 argc, char **argv) { char **var_120h; int64_t var_114h; int64_t var_4h; var_114h._0_4_ = (undefined4)argc; func_0x00400508(0x400741, (int64_t)&var_114h + 4); var_4h._0_4_ = func_0x004004e0((int64_t)&var_114h + 4); func_0x004004e8("Hello %s\n", (int64_t)&var_114h + 4); return 0; } cutter가 디컴파일을 제대로 못하길래 pwngdb를 이용했다. 따라서 main() 에서 호출되는 세 함수는 차례로 scanf..
-
내 버퍼가 흘러넘친다!!!CTF/HackCTF 2021. 1. 21. 01:15
Disassembly 디스어셈블리 undefined4 main(void) { char *s; setvbuf(_reloc.stdout, 0, 2, 0); printf("Name : "); read(0, name, 0x32); printf("input : "); gets(&s); return 0; } 코드 영역의 name 위치에 0x32만큼 입력받고, gets를 통해 스택 버퍼 오버플로우가 발생하는 코드이다. RET Overwrite 스택 버퍼 오버플로우가 발생하므로 RET Overwrite을 시도해보자. return address를 덮을 gadget이 필요한데, 주소 name을 알고 있으므로 name에 쉘코드를 넣고 덮어쓰면 문제를 풀 수 있다. Code 더보기 from pwn import * binary..