-
[HackCTF] Offset Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 19. 23:48
이번 문제는 Offset이다~
지금까지의 문제와는 다르게 처음으로 Mitigation이 걸려있다.
RELRO가 FULL이기 때문에 write권한이 없어서 Got Overwrite를
진행할 수 없고 PIE와 NX가 걸려있기 때문에 Code영역을 포함한
모든영역이 랜덤하게 매핑되며 data, stack, heap에 실행권한이 없다.
코드를 보도록 하자~
코드를 보면 gets함수를 이용해서 s 버퍼에 값을 받고
그 s 버퍼를 인자로 select_func 함수를 호출한다.
select_func 함수를 보도록 하자. v3를 보게되면
기본적으로 two함수의 주소를 받고 있다. 만약 s 버퍼에
입력한 값이 "one"이 된다면 v3의 값은 one 함수의 주소가 된다.
그러므로 우리는 이 호출되는 v3의 주소를 우리가 원하는 주소로 대체해주면된다.
어셈블리어 코드로 보기전에 해당 바이너리에 사용된 함수를 보았다.
print_flag라는 의심스러운 함수가 보였다.
해당 함수를 보니 역시나 flag에 관련된 정보를 읽어오고 있었다.
그러므로 해당 주소 print_flag 함수 주소를 마지막에 호출되는 v3주소 대신 넘겨준다면.
그렇게 되면 print_flag가 실행되면서 flag를 볼 수 있을 것이다.
그렇다면 select_func함수에서 마지막에 호출되는 부분을 찾아보도록 하자.
select_func함수에서 call되는 주소값은 eax인데
바로 v3 일 것이다. 그러므로 v3의 주소가 0x56555600이므로
우리가 저 위치를 찾아서 우리가 원하는 값으로 덮으면 된다.
그림은 10개의 "a"를 입력한 값인데 해당 위치 직전까지 30개의 dummy가
필요하다는 것을 알 수 있었다. 그러므로 우리는 30개의 dummy 다음에
print_flag의 offset을 덮어주면 flag를 보게 될 것이다.
(PIE는 base주소만 바뀌기 때문에 offset값만 맞춰주면 된다!!)
그래서 이 문제의 제목이 offset인가보다~
위의 내용을 토대로 Payload를 구성해보았다.
해당 Payload를 진행하였더니 FLAG를 볼 수 있었다.
반응형'표튜터와 함께하는 Pwnable > HackCTF Write-up' 카테고리의 다른 글
[HackCTF] BOF_PIE Write-up (0) 2019.04.21 [HackCTF] RTL_Wolrd Write-up (0) 2019.04.21 [HackCTF] Simple_Overflow_ver_2 Write-up (0) 2019.04.19 [HackCTF] x64 Simple_size_BOF Write-up (0) 2019.04.18 [HackCTF] x64 Buffer Overflow Write-up (0) 2019.04.18 댓글