Wargame/HackCTF

    [HackCTF] Pwning 풀이 (300p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 원하는 사이즈를 입력하고 data를 입력받고 프로그램을 종료한다. size를 입력받는 데 32 이상이면 프로그램이 종료된다. overflow를 발생시키려면 무조건 nptr의 크기보다 크게 입력을 받아야한다. 이 문제는 간단하게 Integer underflow를 이용해 해결할 수 있다. (Integer underflow를 모른다면 꼭 찾아보시길) size에 -1를 넣어 크기를 아주 많이 넉넉하게 늘려주자. 그 후, ROP를 이용해 쉘을 따주면 된다 from pwn import * #context.log_level = ..

    [HackCTF] Gift 풀이 (250p)

    풀이 Arch: i386-32-little RELRO: No RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 첫 입력은 그대로 출력하고, 다음 입력을 받고 프로그램을 종료한다. 딱히 설명할게 없는 문제다. 프로그램을 실행하면 binsh와 system의 주소를 주는 데, 그냥 ROP로 입력받고 system(binsh)를 실행하면 끝이다. from pwn import * context.log_level = 'debug' p = remote('ctf.j0n9hyun.xyz', 3018) e = ELF('./gift') pr = 0x80483ad p.recvuntil('are: ') binsh_address = int(p.recv(9),1..

    [HackCTF] Look at me 풀이 (250p)

    풀이 Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) Hellooooooo라는 문구가 뜨고 입력을 받고 프로그램을 종료한다. 누가봐도 v1에 overflow가 일어난다. 간단하게 ROP로 풀어주면 될 듯 하지만, 이 바이너리는 statically linked다. 오래전에 풀어서 기억은 잘 안나는데 아마 mprotect로 풀었던 거 같다. mprotect 함수는 NX bit가 걸려있어도, 메모리 영역의 권한을 바꿔 쉘 코드를 실행할 수 있게 만들어준다. int mprotect(void *addr, size_t len, int prot); addr에는 메모리 주소, len..

    [HackCTF] Beginner_Heap 풀이 (250p)

    풀이 기말고사 때문에 풀고도 포스팅을 못한 문제들의 풀이를 쭉 적을 것이다. Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) 2번 입력을 받고 프로그램을 종료한다. 아래 Bold 글씨로 표시한 것만 봐도 코드의 흐름이 어떻게 흘러 가는지 알 수 있을 것이다. gdb-peda$ x/32x 0x602290 0x602290: 0x0000000000000000 0x0000000000000021 0x6022a0: 0x0000000000000001 0x00000000006022c0 0x6022b0: 0x0000000000000000 0x0000000000000021 0x6022c..

    [HackCTF] RTL_Core 풀이 (250p)

    풀이 Arch: i386 - 32 - little RELRO : Partial RELRO Stack : No canary found NX : NX enabled PIE : No PIE(0x8048000) 먼저 rtlcore을 실행해보자. 저번 문제와 마찬가지로 패스코드 인증 문제이다. IDA를 이용해 슈도코드를 확인해보자. main Pseudocode int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+Ch] [ebp-1Ch] setvbuf(_bss_start, 0, 2, 0); puts(&::s); printf("Passcode: "); gets(&s); if ( check_passcode(&s) == ha..

    [HackCTF] Random Key 풀이 (200p)

    풀이 Arch: amd64 - 64 - little RELRO : Partial RELRO Stack : No canary found NX : NX enabled PIE : No PIE(0x400000) 먼저 random을 실행해보자. 단순한 Key값 검증 프로그램인가? IDA를 이용해 슈도코드를 확인해보자. int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { unsigned int v3; // eax int v4; // [rsp+0h] [rbp-10h] int v5; // [rsp+4h] [rbp-Ch] unsigned __int64 v6; // [rsp+8h] [rbp-8h] v6 = __readfsqword(0x..

    [HackCTF] 1996 풀이 (200p)

    풀이 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) 먼저 1996을 실행해보자. 환경변수를 입력받고, 그 값을 알려주는 코드같다. 이 문제는 슈도코드를 볼 필요도 없이, 그냥 간단한 bof로 풀 수 있다. 이게 왜 200점이지? 입력받는 주소는 rbp-410h이니까, 0x410 + SFP(8) + ret(spawn_shell) 해주면 끝이다. 1 from pwn import * 2 3 p = remote('ctf.j0n9hyun.xyz', 3013) 4 5 payload = '\x90'*0x410 6 payload += 'A'*8 7 payload += p64(0x0..

    [HackCTF] poet 풀이 (200p)

    풀이 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) 먼저 poet을 실행해보자. 시를 적고, 저자를 적으면 점수를 준다. 입력은 무한 반복문으로 받는 듯하다. IDA를 이용해 슈도코드를 확인해보자. main Pseudocode int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { const char *v3; // rdi setvbuf(_bss_start, 0LL, 2, 0LL); v3 = s; puts(s); while ( 1 ) { get_poem(v3, 0LL); get_auth..