CodeBlue CTF 2017 simple memo pad Write Up
0. introduce
대회 때 대충 예상은 했는데 아니겠지~ 하고 넘기다가 못풀었다..
1. Binary
RELRO |
STACK CANARY |
NX |
PIE |
RPATH |
RUNPATH |
FILE |
No RELRO |
Canary found |
NX enabled |
No PIE |
No RPATH |
No RUNPATH |
simple_memo_pad |
Init : 20개의 청크를 할당하고 각 청크에 앞부분에 카나리를 넣는다.
1). Write a note on a blank area -> 카나리가 제대로 존재하는지 확인하고 앞 청크부터 기록한다.
2). Edit a note -> 카나리가 제대로 존재하는지 확인하고 입력한 청크를 수정한다.
3). Delete a note -> 카나리가 제대로 존재하는지 확인하고 입력한 청크를 지운다. (unlink)
4). Show a note -> 사용할 수 없는 기능이라고 나온다.
# Edit과 Delete는 한번씩밖에 할 수 없다.
2. Vulnerability
struct note
{
__int64 canary;
__int32 chk;
__int32 index;
char buf[128];
__int64 fb;
__int64 bk;
};
buf에 처음 할당할때는 128을 쓸 수 있고 수정할때는 136을 쓸 수 있어서 fb를 덮을 수 있다.
그리고 Delete되는 부분이 아래와 같이 자체적으로 unlink를 진행하기 때문에 취약점이 발생한다.
fb를 조작가능 하기 때문에 특정한 주소에 bk에 들어있는 주소를 넣는것이 가능하다.
3. Exploit
익스는 생각보다 간단한데, strtab의 주소를 bk의 주소로 덮어주면 된다. 그러면 strtab을 조작할 수 있고, 원하는 함수를 호출할 수 있다.