본문 바로가기

System Hacking

[드림핵] fho 풀이 - 티스토리

PIE가 적용된 바이너리를 대상으로 실습하도록 설계된 문제이다

 

 

 

 

그동안 배운 보호기법들이 전부 적용된 모습을 볼 수 있다

 

 

 

 

코드를 살펴보면 buf에서 BOF가 발생하고 이를 통해 원하는 값을 얻을 수 있다 

 

 

또한 addr과 value의 관계를 보면 addr에 들어간 주소가 가리키는 값에 value에 입력 받은 값을 넣어주고 있다

 

 

문제 자체가 hook-overwrite하는 문제이므로 adrr에 __free_hook의 주소 값을 넣고 value에 system주소 값을 넣는 것으로 추측 가능하다

 

 

마지막에 addr에 한 번 더 입력 받고 있다

 

 

이미 __free_hook변수가 가리키는 값은 바꼈으므로 addr에 인자를 전달해주면 된다

 

 

여기서 addr에 /bin/sh의 주소값을 넣어주면 free인자로 addr이 오고 있으므로 __free_hook에 인자로 넘어가 system("/bin/sh")을 실행 시킬 수 있다.

 

 

 

buf에서 main함수의 ret 값인 __libc_start_main함수의 코드 어느 부분의 주소값을 구할 수 있다

 

 

이를 통해 __libc_start_main의 libc내 offset값을 빼면 libc의 base주소를 릭 할수 있고

 

 

system과 /bin/sh의 주소도 릭이 가능하다

 

 

 

** bt 명령어는 backtrace로서 실행중인 프로그램의 '호출 스택'을 보여준다

 

호출 스택은 실행중인 함수와 그 함수가 호출된 함수의 순서를 나타내는 데이터 구조이다

 

따라서 main함수 이전의 함수인 __libc_start_main의 코드 흐름을 확인 가능하다

 

 

** x 명령어에 i옵션을 주면 해당 주소의 기계어 명령어를 확인 가능

 

따라서 main의 ret로 실행되는 다음 코드 흐름은 __libc_start_main + 231이므로 구한 __libc_start_main의 offset값에 231을 더 해서 주소값을 빼면 된다

 

 

 

코드 내부

 

 

main stack frame

 

buf에 값을 넣어서 ret부터 릭 하자

 

필요한 정보들

 

 

구한 정보들을 알맞게 입력해주면 끝

 

 

 

 

전체 payload

 

 

 

 

처음에 접근을 puts의 got값을 addr에 넣어서 %p로 출력하면 libc내 puts의 주소를 얻을 줄 알았는데 생각해보니 그렇게 하면 puts의 got값만 출력이 된다

 

 

그래도 코드 해석을 통해 addr에 hook주소 넣고 value에 system 주소 넣는거까지는 접근했으니 나름 잘한듯

 

 

**알게된 것들

 

pwntools 내 send나 sendline들의 함수의 인자로는 문자열을 줘야 함

 

따라서 코드 내부 함수가 정수 형태로 입력을 받을 경우에는 정수 그대로 전송을 해주어야 하지만

 

send는 문자열을 인자로 받으므로 str로 묶어서 문자열 형태로 변환해서 전송하면 된다

 

그러나 컴퓨터 내부에선 바이트 형태로 문자를 처리하므로 encode 메소드를 추가로 붙여 바이트 형태로 바꿔줘야함

 

+ 카나리 값을 안 덮은 이유는 카나리 검사를 하기전에 free함수로 /bin/sh이 실행되기 때문이다

 

그러므로 주소 자체를 전달할 때는 '\xaa' 와같은 형태로 전송했던 것임

 

 

 


진도를 빨리 빼는것도 중요하지만

 

그동안 배운 개념들을 다시 한 번 복습하는 시간을 갖고 블로그에 정리 후에 진도를 뺴는 것도 좋을 거 같다