본문 바로가기

system/writeup

2019 besidesSF genius

genius

2019 besidesSF genius

바이너리는 loadergenius 두 개의 바이너리가 주어졌다.

 

loadergenius를 로드한 후, 코드를 입력받고 게임을 실행시켜주고 genius는 테트리스 바이너리이다.

 

loader 부분을 분석해 보면 테트리스 게임에 불필요한 부분이 바로 보이는데 코드 패치 부분이다.

 

코드를 입력받고 apply_patch 함수를 부른다.

패치는 총 두 번(2 byte) 할 수 있다.

apply_patch 함수를 살펴보자.

 

우리가 입력한 코드를 통해 b1, b2, b3, b4, b5, b6가 결정되고 이는 idxval 계산에 사용된다.

 

match 함수는 str to int 함수이다. 코드를 숫자로 매칭시킨다.

 

여기서 우리가 원하는 idxval값을 만들기 위한 code를 알아내야 한다.

이는 역연산을 통해 알아낼 수 있다.

idx(2byte)val(1byte)bitmap을 살펴보면

위와 같이 비트가 분포하여 있다.

이를 이용하여 역연산 코드를 짜면

 

위와 같이 된다.

 

이제 genius 바이너리의 어느 부분을 패치하냐인데..

처음에 system_got의 주소와 game_obj의 주소를 준다.

 

마지막에 게임이 끝났을 때 memsetgame_obj 인자를 가지고 실행하는데, memset의 뒤 1바이트를 바꾸면 system 함수로 바꿀 수 있다.

이 상황에선 game_obj의 값을 sh;로 만들어주면 쉘이 따일 것이다.

 

game_obj는 디버깅해보면 game_map을 나타낸다는 것을 쉽게 알 수 있다.

여기에 어떻게 sh;를 포함하게 하냐인데..

 

gdb를 통해 확인해 보면 위와 같이 블록이 배치되어 있으면 sh;가 셋팅된다.

system 함수를 성공적으로 만들었으면 이제 게임을 즐기며 저러한 형태의 블록을 만들고 쉘을 따면 된다.

 

대회 때는 sh;를 못만들어 못풀었어서, sh;를 만드는 코드는 https://github.com/merrychap/ctf-writeups/tree/master/2019/BSidesSF%202019%20CTF/genius 여기를 참조했다.

테트리스 못하면 문제도 못푸네 ㅠㅠ!!


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

2019 utctf jendy's  (0) 2019.03.17
2019 besidesSF slowfire  (0) 2019.03.16
2019 besidesSF straw-clutcher  (0) 2019.03.15
2019 aeroctf remote_storage  (0) 2019.03.14
2016 seccon jmper  (0) 2019.03.13