CTF
-
[0x41414141 CTF] Moving signalsCTF/WRITEUP 2021. 2. 2. 17:34
Disassembly 디스어셈블리 주어진 바이너리는 짧은 명령어들로 구성되어 있다. 'pop rax; ret'과 'syscall'이 눈에 띈다. "/bin/sh" 문자열이 바이너리 상에 존재한다. Sigreturn Oriented Programming 버퍼 오버플로우가 발생하고 rax를 제어할 수 있으므로 원하는 syscall을 호출할 수 있다. sigreturn을 통해 레지스터의 값을 조작해서 execve("/bin/sh", 0, 0)을 호출하면 문제를 해결할 수 있다. Code 더보기 from pwn import * binary = "./moving-signals" server = "185.172.165.118" port = 2525 # context.log_level = 'debug' context..
-
[0x41414141 CTF] echoCTF/WRITEUP 2021. 2. 2. 17:27
Disassembly 디스어셈블리 main은 echo를 호출하고 exit로 프로세스를 종료한다. void main(void) { echo(); exit(0); } echo는 0x300 바이트 만큼 값을 읽어오고, 이를 출력하는 역할을 한다. void echo(void) { int sz = read(0, [rbp-0x180], 0x300); write(1, [rbp-0x180], sz); } 사용할 만한 라이브러리는 없고, NX가 켜져있으니 레지스터를 조작해 syscall을 통해 공격하는 수밖에 없다. Sigreturn Oriented Programming rax에 원하는 값을 넣기 위해서는 write 함수의 리턴값을 이용할 필요가 있다. 공격은 세 단계로 이루어진다. 스택 버퍼 오버플로우를 이용해 RET..
-
[0x41414141 CTF] Return Of The ROPsCTF/WRITEUP 2021. 2. 2. 15:45
Disassembly 디스어셈블리 문제에서 제공하는 파일은 main.sh, PoW, return-of-the-rops로 세 개이다. #!/bin/bash `pwd`/PoW if [ $? == 0 ]; then echo "\n" `pwd`/ret-of-the-rops fi main.sh는 PoW가 통과하면 바이너리를 실행한다. def PoW(res): for x in tqdm(product(ascii_lowercase, repeat=4)): d = "" for i in x: d += i y = md5(d.encode()).digest().hex() if y[-6:] == res: log.info("key : " + d) p.sendline(d) p.recvline() break dest = p.recvli..
-
-
ROPCTF/HackCTF 2021. 2. 1. 23:44
Disassembly 디스어셈블리 undefined4 main(void) { int32_t var_4h; vulnerable_function(); write(1, "Hello, World!\n", 0xe); return 0; } void vulnerable_function(void) { int32_t var_88h; read(0, &var_88h, 0x100); return; } vulnerable_function에서 read로 0x100만큼 입력받아 스택 버퍼 오버플로우가 발생한다. Return Oriented Programming 목표는 systen("/bin/sh")를 호출하는 것이므로 라이브러리 주소를 알아야 한다. payload = b"A"*0x8c payload += p32(write_plt)..
-
You are silverCTF/HackCTF 2021. 2. 1. 20:35
Disassembly 디스어셈블리 undefined8 main(void) { char *format; int32_t var_8h; int64_t var_4h; setvbuf(_reloc.stdout, 0, 2, 0); var_4h._0_4_ = 0x32; puts("Please enter your name"); fgets(&format, 0x2e, _reloc.stdin); printf(); var_8h = get_tier((uint64_t)(uint32_t)var_4h); printf((int64_t)var_8h); return 0; } main은 fgets로 입력받은 후 printf를 통해 포맷 스트링 버그가 발생한다. 이후 var_4h를 인자로 get_tier를 호출하고, get_tier의 반환값을..
-
GiftCTF/HackCTF 2021. 2. 1. 05:25
Disassembly 디스어셈블리 undefined4 main(void) { int32_t unaff_EBX; char *format; int32_t var_4h; __x86.get_pc_thunk.bx(); alarm(0x3c); setvbuf(**(undefined4 **)(unaff_EBX + 0x138e), 0, 2, 0); setvbuf(**(undefined4 **)(unaff_EBX + 0x138a), 0, 2, 0); setvbuf(**(undefined4 **)(unaff_EBX + 0x137e), 0, 2, 0); printf(unaff_EBX + 0x13e, binsh, *(undefined4 *)(unaff_EBX + 0x1382)); fgets(&format, 0x80, **(un..
-
Loot at meCTF/HackCTF 2021. 2. 1. 04:58
Disassembly 디스어셈블리 undefined4 main(void) { undefined4 uVar1; int32_t var_ch; int32_t var_4h; setvbuf(_stdout, 0, 2, 0); uVar1 = getegid(); __setresgid(uVar1, uVar1, uVar1); look_at_me(); return 0; } void look_at_me(void) { char *s; puts("Hellooooooooooooooooooooo"); gets((int32_t)&s); return; } gets로 인해 스택 버퍼 오버플로우가 발생한다. ROP NX가 켜져 있으므로 스택에 쉘코드 삽입을 통한 공격은 불가능하고, 라이브러리가 정적으로 링크되어 있기 때문에 Return-t..