이번엔 Buffer OverFlow PIE 문제를 풀어보겠다.
PIE가 걸려 있을 것 같지만, 우선 checksec부터 해보자.
NX bit와 PIE가 걸려 있는 것을 확인할 수 있다. NX bit는 쉘 코드 실행을 막는 보호 기법이다.
이 문제에서 절대적으로 중요한 보호기법은 PIE 기법이다. PIE 기법이란, 함수를 실행할 때마다 호출할 주소가 고정되어 있는 것이 아닌, 상대 주소를 호출하여 한 번의 단계를 더 거쳐서 다른 함수를 호출하는 것이다.
예를 들어, main함수를 디스어셈블할 때 일반적으로 0x8000xxxx와 같은 주소가 아니라 0x100 같은 아주 작은 주소로 바뀌게 된다.
이 보호 기법을 우회하기 위해서 memory 주소를 leak 하거나 ROP 기법을 활용할 수 있다.
우선 바이너리부터 확인해보자.
welcome이라는 함수가 있다. 더블클릭 해보자.
보니 welcome 함수에서는 welcome함수의 실제 주소를 알려주고 있다.
따라서 printf에서 출력되는 주소를 leak 한 다음, 쉘을 따도록 도와주는 함수를 찾아 welcome과의 offset을 구하면 문제가 풀릴 것이라 생각했다.
다행히도 j0n9hyun 함수를 호출하면 flag를 출력해주기 때문에 ROP를 사용하지 않고 문제를 풀 수 있다.
우선 base address에서 welcome의 상대 주소는 0x909이고 j0n9hyun의 상대주소는 0x890이다.
따라서 leak 한 welcome 주소에서 (0x909-0x890=0x79)를 빼주면 j0n9hyun 함수를 호출할 수 있을 것이다.
welcome의 return에서 크기 18byte인 v1을 입력받으므로 dummy(22byte)+(leak_address-0x79)(4byte)를 주면 된다.
exploit code는 다음과 같다.
실행해보면 flag가 출력되는 것을 볼 수 있다.!!
'Hacking > HackCTF' 카테고리의 다른 글
HackCTF RTL_World Write-up (0) | 2020.01.06 |
---|---|
HackCTF Yes or no Write-up (0) | 2020.01.06 |
HackCTF offset Write-up (0) | 2019.12.29 |
HackCTF Simple_Overflow_ver_2 Write-up (0) | 2019.12.23 |
HackCTF x64 Simple_size_BOF Write-up (0) | 2019.12.23 |