[pwnable.xyz] note(50 pts) :: Write-Up
두비니
·2020. 10. 9. 16:03
이 글이 wargame 카테고리의 100번째 글이에요! 와아아아 더 열심히 하겠습니다ღ'ᴗ'ღ
Note taking 101
일단 문제분석을 해봅시다.
메뉴는 1이면 edit_note()를, 2이면 edit_desc()를, 3이면 종료하네요.
각각 edit_note()와 edit_desc()를 좀 더 봅시다.
먼저 edit_note()입니다.
note의 길이를 입력받고, buf에 해당 메모리 만큼 malloc으로 동적할당을 받은 뒤, 입력값을 전역변수 s에 복사합니다.
strncpy()를 한 뒤에는 buf는 free()시키네요.
다음은 edit_desc()입니다. 만약 buf에 주소가 할당되어있지 않는 경우, 0x20만큼의 메모리를 동적할당 해주고, buf에 값을 read()를 통해 읽어오네요.
마지막으로 win()함수가 있네요. 당연히 이 함수의 주소를 ret에 집어넣든, GOT overwrite를 하든 해야겠죠?
이건 변수들 사이의 상태를 보고 시나리오를 짜야할 것 같네요.
다음은 이 문제에서 쓰이는 변수들의 메모리 상황입니다. s와 buf변수 모두 전역변수이기때문에 bss영역에 있는 것을 볼 수 있고, 두 변수 사이간의 offset은 0x20으로, 충분히 edit_note()를 통해 buf까지 buffer overflow를 할 수 있는 상황입니다. 이걸 이용해서 GOT overwrite를 이용하려고 합니다.
GOT overwrite는 PIE가 걸려있지 않아야 하는데, PIE도 걸려있지 않아서 사용할 수 있겠네요.
자, 그러면 공격 시나리오는 다음과 같습니다.
시나리오
목적 : win()함수를 실행시키고자 함
방법 : GOT overwrite를 통해 printf()가 실행되었을 때 win()이 실행하게 하고자 함
+) GOT overwrite는 edit_desc()안에있는 read()함수를 이용할 것임
시나리오 :
1. edit_note()를 통해 buf까지 buffer overflow를 시킵니다. 이때, buf에는 printf의 got주소가 오도록 합니다.
2. edit_desc()를 실행시키고, 내용에 win()함수의 주소를 입력합니다.
3. 다시 main함수로 돌아오면, printf함수는 win함수의 주소로 got overwrite되었기때문에 printf대신 win이 실행되면서 flag가 얻어집니다.
참고로 GOT overwrite를 모르시는 분들은 찾아보고 옵시다. 저는 개인적으로 다음 두 글이 제일 잘 설명했다고 생각해요.
참고1) d4m0n.tistory.com/83
페이로드
그럼 페이로드 기릿
<<후배들한테 받은 질문들>>
1. 꼭 printf를 got overwrite를 해야하나요?
아니요! 어떤 함수든 상관없습니다. 대신 got overwrite해준 함수는 꼭 실행시켜주어야하겠죠?
2. 함수의 got는 어떻게 구하나요?
제가 써놓은글 있으니 이거 읽읍시다 ㅎㅅㅎ
'War Games > pwnable.xyz' 카테고리의 다른 글
[pwnable.xyz] two targets(50 pts) :: Write-Up (0) | 2020.10.10 |
---|---|
[pwnable.xyz] grownup(50 pts) :: Write-Up (0) | 2020.09.17 |
[pwnable.xyz] misalignment(50 pts) :: Write-Up (0) | 2020.09.08 |
[pwnable.xyz] xor(50 pts) :: Write-Up (0) | 2020.08.12 |
[pwnable.xyz] Add(50 pts) :: Write-Up (0) | 2019.11.06 |