분류 전체보기
-
[0x41414141 CTF] The Pwn InnCTF/WRITEUP 2021. 1. 30. 23:55
Disassembly 디스어셈블리 undefined8 main(void) { int64_t iVar1; int64_t in_FS_OFFSET; int64_t canary; iVar1 = *(int64_t *)(in_FS_OFFSET + 0x28); ignore_me_init_buffering(); ignore_me_init_signal(); puts("Welcome to the pwn inn! We hope that you enjoy your stay. What\'s your name? "); vuln(); if (iVar1 != *(int64_t *)(in_FS_OFFSET + 0x28)) { // WARNING: Subroutine does not return __stack_chk_fail(); } ..
-
Basic_FSBCTF/HackCTF 2021. 1. 29. 00:43
Disassembly 디스어셈블리 undefined4 main(void) { int32_t var_4h; setvbuf(_reloc.stdout, 0, 2, 0); vuln(); return 0; } main()은 vuln()을 호출한다. void vuln(void) { char *format; char *var_408h; printf("input : "); fgets(&format, 0x400, _reloc.stdin); snprintf(&var_408h, 0x400, &format); printf(&var_408h); return; } vuln()은 fgets()로 문자열을 입력받고, snprintf()와 printf() 두 번에 걸쳐 포맷 스트링 버그가 발생한다. void flag(void) { p..
-
[0x41414141 CTF] externalCTF/WRITEUP 2021. 1. 27. 16:27
Disassembly 디스어셈블리 문제를 보면 별다른 설명 없이 라이브러리와 바이너리 파일이 있다. undefined8 main(void) { void *buf; puts("ROP me ;)"); printf(0x40201c); read(0, &buf, 0xf0); clear_got(); return 0; } main 함수는 puts, printf, read, clear_got를 차례대로 호출하고, read에서 스택 버퍼 오버플로우가 발생한다. void clear_got(void) { memset(reloc.puts, 0, 0x38); return; } clear_got 함수는 reloc.puts부터 0x38바이트 길이를 초기화한다. 초기화되는 부분은 got 영역 전체이다. 재할당된 라이브러리 함수들의 ..
-
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..