CTF
-
Unexploitable #3CTF/HackCTF 2021. 2. 5. 16:10
Disassembly 디스어셈블리 undefined8 main(void) { char *s; setvbuf(_reloc.stdout, 0, 2, 0); setvbuf(_reloc.stdin, 0, 2, 0); fwrite("Impossible RTL ha? Nothing for you!\n", 1, 0x24, _reloc.stdout); fgets(&s, 0x100, _reloc.stdin); return 0; } system 가젯이 사라지고 fgets로 입력받는 버퍼 크기가 0x100바이트로 증가한 것 외에는 Unexploitable #2와 차이가 없다. Return-to-csu syscall과 system 가젯이 보이지 않으므로 공격을 위해서는 라이브러리 주소에 대한 정보가 필수적이고, 각종 데이터를..
-
babyfsbCTF/HackCTF 2021. 2. 5. 05:26
Disassembly 디스어셈블리 undefined8 main(void) { undefined8 uVar1; int64_t in_FS_OFFSET; char *format; int64_t canary; canary = *(int64_t *)(in_FS_OFFSET + 0x28); setvbuf(_reloc.stdout, 0, 2, 0); puts("hello"); read(0, &format, 0x40); printf(&format); uVar1 = 0; if (canary != *(int64_t *)(in_FS_OFFSET + 0x28)) { uVar1 = __stack_chk_fail(); } return uVar1; } main은 read로 0x40바이트만큼 입력받아 이를 printf로 출력하기 때..
-
Unexploitable #2CTF/HackCTF 2021. 2. 5. 03:07
Disassembly 디스어셈블리 undefined8 main(void) { char *s; setvbuf(_reloc.stdout, 0, 2, 0); setvbuf(_reloc.stdin, 0, 2, 0); fwrite("Hard RTL ha? You don\'t even have fflush@dynstr!\n", 1, 0x30, _reloc.stdout); fgets(&s, 0x40, _reloc.stdin); return 0; } Unexploitable #1에서 fflush가 사라진 것을 제외하면 같은 문제이다. Return Oriented Programming 이전 문제에서 fflush를 이용하지 않고 해결했기 때문에, 같은 풀이를 사용했다. Code 더보기 from pwn import * bi..
-
RTCCTF/HackCTF 2021. 2. 5. 01:20
Disassembly 디스어셈블리 void main(void) { void *buf; setvbuf(_reloc.stdin, 0, 2, 0); write(1, "Hey, ROP! What\'s Up?\n", 0x15); read(0, &buf, 0x200); return; } main은 read에서 0x200바이트만큼 입력받아 스택 버퍼 오버플로우가 발생한다. Return-to-csu NX가 걸려있고, system 함수가 링크되어 있지 않으며, syscall 명령어도 존재하지 않는다. 결국 RTL을 통해 system("/bin/sh")를 호출해야 하므로 라이브러리 주소를 알아낼 방법이 필요하다. write와 read 함수의 세 번째 인자로 사용될 rdx를 제어할 가젯으로 __libc_csu_init 함수..
-
RegisterCTF/HackCTF 2021. 2. 4. 23:49
Disassembly 디스어셈블리 undefined8 main(void) { alarm(5); setvbuf(_reloc.stdout, 0, 2, 0); build(); return 0; } main은 build를 호출한다. void build(void) { int32_t iVar1; int64_t in_FS_OFFSET; int64_t var_40h; int64_t var_38h; int64_t var_30h; int64_t var_28h; int64_t var_20h; int64_t var_18h; int64_t var_10h; int64_t var_8h; var_8h = *(int64_t *)(in_FS_OFFSET + 0x28); signal(0xe, handler); do { do { get_o..
-
Unexploitable #1CTF/HackCTF 2021. 2. 4. 21:24
Disassembly 디스어셈블리 undefined8 main(void) { char *s; setvbuf(_reloc.stdout, 0, 2, 0); setvbuf(_reloc.stdin, 0, 2, 0); fwrite("Easy RTL ha? You even have system@plt!\n", 1, 0x27, _reloc.stdout); fflush(_reloc.stdin); fgets(&s, 0x40, _reloc.stdin); return 0; } main에서 fgets로 인해 스택 버퍼 오버플로우가 발생한다. void gift(void) { system("use this system gadget :D"); return; } gift에서 system을 호출하므로 이를 이용할 수 있다. "/bin..
-
[0x41414141 CTF] BabyheapCTF/WRITEUP 2021. 2. 3. 01:12
Summary 개요 Unsorted bin attack으로 libc address leak Tcache dup으로 __free_hook에 heap 할당 oneshot gadget으로 hook Overwrite Disassembly 디스어셈블리 undefined8 main(void) { int32_t iVar1; undefined8 uVar2; int64_t in_FS_OFFSET; undefined var_dh; int32_t var_ch; int64_t var_8h; var_8h = *(int64_t *)(in_FS_OFFSET + 0x28); ignore_me_init_buffering(); puts("You can never miss the chance to have a baby heap chall..
-
[0x41414141 CTF] Faking till you're MakingCTF/WRITEUP 2021. 2. 2. 19:42
Disassembly 디스어셈블리 #!/bin/bash `pwd`/PoW if [ $? == 0 ]; then echo "\n" `pwd`/vuln fi main.sh는 PoW 이후 vuln을 실행한다. undefined8 main(void) { void *buf; undefined auStack88 [64]; char *s; void *ptr; setvbuf(_reloc.stdout, 0, 2, 0); printf(0x200c, sh); malloc(1); read(0, &buf, 0x50); ptr = auStack88; free(ptr); s = (char *)malloc(0x30); fgets(s, 0x404, _reloc.stdin); return 0; } vuln은 함수 sh의 주소를 출력하고..