Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF BOF_PIE Write-up

Ainsetin 2020. 1. 6. 11:50

이번엔 Buffer OverFlow PIE 문제를 풀어보겠다.

 

 

PIE가 걸려 있을 것 같지만, 우선 checksec부터 해보자.

 

 

NX bit와 PIE가 걸려 있는 것을 확인할 수 있다. NX bit는 쉘 코드 실행을 막는 보호 기법이다.

 

이 문제에서 절대적으로 중요한 보호기법은 PIE 기법이다. PIE 기법이란, 함수를 실행할 때마다 호출할 주소가 고정되어 있는 것이 아닌, 상대 주소를 호출하여 한 번의 단계를 더 거쳐서 다른 함수를 호출하는 것이다.

 

예를 들어, main함수를  디스어셈블할 때 일반적으로 0x8000xxxx와 같은 주소가 아니라 0x100 같은 아주 작은 주소로 바뀌게 된다.

 

이 보호 기법을 우회하기 위해서 memory 주소를 leak 하거나 ROP 기법을 활용할 수 있다.

 

우선 바이너리부터 확인해보자.

 

main()

welcome이라는 함수가 있다. 더블클릭 해보자.

 

welcome()

 

보니 welcome 함수에서는 welcome함수의 실제 주소를 알려주고 있다.

 

따라서 printf에서 출력되는 주소를 leak 한 다음, 쉘을 따도록 도와주는 함수를 찾아 welcome과의 offset을 구하면 문제가 풀릴 것이라 생각했다.

 

j0n9hyun()

 

다행히도 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