본문 바로가기

system/writeup

2016 seccon jmper

jmper

2016 seccon jmper

ㅎㅎ 재밌는 문제였다.

취약점은 one byte overflow이며, 특별한 것은 setjmp, longjmp 함수를 이용하여 함수간 점프를 한다는 것이다.

 

setjmp 함수에서 jmpbuf에 레지스터 값을 저장하고

 

student_num 변수가 29를 넘게 되면 longjmp로 점프한다 !

이 때, jmpbuf를 참조하여 저장된 eip로 이동하며, 그 때의 setjmp 함수의 리턴값은 114514가 된다.

 

setjmp 했을 때의 jmpbuf의 상황을 보자.

요롷게 되어있다.

 

struct를 찾아보니 위와 같이 나와 있었다.

흠.. 근데 반대로 되어있었다. 버전이 다른건가

0, ebp, edi, esi, ebx, ecx, esp, eip 순서이다.

 

근데 값들을 보면 무작위 16진수 8개로 구성되어 있는데, longjmp할 때 이 값들을 어떻게 처리하는지 확인해보자.

 

값을 받아오고, ror r8, 0x11, xor r8, magic_number를 실행한다.

여기서 magic_numbertcb structure에 나와있으므로, 확인해 보자.

 

pointer_guard 값이라고 생각된다.

이 값을 알아내야 우리가 원하는 값을 암호화시켜 넣고 연산을 마쳣을때 원하는 값이 나오게 할 수 있겠다.

이는 암호화된 eipleak한 후, 역연산으로 알아낼 수 있다.

ROR(encrypted_eip, 0x11) ^ magic_number = 0x400c31 이니, 매직넘버를 알아낼 수 있다!

 

이렇게 magic_number를 알아낸 후, 익스하면 된다리!

 


'system > writeup' 카테고리의 다른 글

2019 besidesSF straw-clutcher  (0) 2019.03.15
2019 aeroctf remote_storage  (0) 2019.03.14
pwnable.tw de-aslr  (0) 2019.03.11
pwnable.tw kidding  (0) 2019.03.10
pwnable.kr + pwnable.tw unexploitable  (0) 2019.03.08