CTF
-
World Best Encryption ToolCTF/HackCTF 2021. 2. 9. 03:56
Disassembly 디스어셈블리 undefined8 main(void) { int32_t iVar1; int64_t in_FS_OFFSET; int64_t var_88h; char *src; char *dest; int64_t canary; canary = *(int64_t *)(in_FS_OFFSET + 0x28); setvbuf(_reloc.stdout, 0, 2, 0); do { puts("Your text)"); __isoc99_scanf("%s", &src); // stack buffer overflow for (int i = 0; i < 0x32; i++) { src[i] ^= 0x1c; } strncpy(&dest, &src, 0x39); printf("Encrypted text)\n%s"..
-
UAFCTF/HackCTF 2021. 2. 9. 02:07
Disassembly 디스어셈블리 void main(void) { int32_t num; setvbuf(_reloc.stdout, 0, 2, 0); setvbuf(_reloc.stdin, 0, 2, 0); do { menu(); read(0, auStack24, 4); num = atoi(auStack24); switch(num) { default: puts("유효하지 않는 값입니다."); break; case 1: add_note(); break; case 2: del_note(); break; case 3: print_note(); break; case 4: exit(0); } } while( true ); } main은 다음에 실행할 명령을 입력받는다. void add_note(void) { und..
-
Beginner_HeapCTF/HackCTF 2021. 2. 9. 00:30
Disassembly 디스어셈블리 void main(undefined8 argc, char **argv) { undefined4 *puVar1; undefined8 uVar2; undefined4 *puVar3; char *src; puVar1 = (undefined4 *)malloc(0x10); *puVar1 = 1; uVar2 = malloc(8); *(undefined8 *)(puVar1 + 2) = uVar2; puVar3 = (undefined4 *)malloc(0x10); *puVar3 = 2; uVar2 = malloc(8); *(undefined8 *)(puVar3 + 2) = uVar2; fgets(&src, 0x1000, _reloc.stdin); strcpy(*(undefined8 *..
-
j0n9hyun's secretCTF/HackCTF 2021. 2. 7. 21:12
Disassembly 디스어셈블리 undefined8 main() { setvbuf(*(int64_t *)0x6ca748, 0, 2, 0); setvbuf(*(int64_t *)0x6ca740, 0, 2, 0); setvbuf(*(int64_t *)0x6ca738, 0, 2, 0); iVar2 = 0x72; *(undefined4 *)0x6cce98 = open("top_secret"); iVar2 = printf("input name: "); scanf("%s", 0x6ccd60); iVar1 = read(*(undefined4 *)0x6cce98, 0x6ccd6a, 300); write(1, 0x6ccd6a, (int64_t)iVar1); return 0; } main은 top_secret이라는 이름..
-
[DiceCTF 2021] babyropCTF/WRITEUP 2021. 2. 6. 12:59
Disassembly 디스어셈블리 undefined8 main(void) { char *s; write(1, "Your name: ", 0xb); gets(&s); return 0; } gets로 인해 스택 버퍼 오버플로우가 발생한다. Return-to-csu RTC를 이용해 gets와 write의 라이브러리 주소를 구하자. 알아낸 주소를 바탕으로 라이브러리 버전을 알아낸 후, system과 binsh 문자열의 주소를 구해 system("/bin/sh")를 호출하면 문제를 해결할 수 있다. Code 더보기 from pwn import * binary = "./babyrop" lib = "./libc6_2.31-0ubuntu9.2_amd64.so" server = "dicec.tf" port = 31924..
-
SysROPCTF/HackCTF 2021. 2. 5. 20:08
Disassembly 디스어셈블리 undefined8 main(void) { void *buf; setvbuf(_reloc.stdout, 0, 2, 0); setvbuf(_reloc.stdin, 0, 2, 0); read(0, &buf, 0x78); return 0; } main에서 read를 통해 0x78바이트만큼 입력받아 스택 버퍼 오버플로우가 발생한다. Return Oriented Programming NX bit가 걸려있고, system 함수나 syscall 가젯이 없으며, 라이브러리 주소를 leak할 수 있는 함수도 없다. 바이너리에 rax, rdi, rsi, rdx를 제어할 수 있는 가젯이 있으므로 syscall만 확보하면 원하는 시스템 콜을 자유자재로 호출할 수 있을 것이다. 라이브러리의 r..
-
PwningCTF/HackCTF 2021. 2. 5. 19:18
Disassembly 디스어셈블리 void main(void) { setvbuf(_reloc.stdout, 0, 2, 0); vuln(); return; } void vuln(void) { char *str; uint32_t var_ch; printf("How many bytes do you want me to read? "); get_n((int32_t)&str, 4); var_ch = atoi(&str); if ((int32_t)var_ch < 0x21) { printf("Ok, sounds good. Give me %u bytes of data!\n", var_ch); get_n((int32_t)&str, var_ch); printf("You said: %s\n", &str); } else { pr..