이번에는 치킨을 먹었다. 1등과 2등 상품의 격차가 엄청나기 때문에 1등을 하고 싶었다.
그래서 라업을 정리해본다. 자세히는 아니고 시나리오 위주로..
start
double free가 가능한 것을 이용하여 미리 bss영역에 fake chunk를 만들어 둔 뒤에, 전역변수 값을 autumn으로 바꾸면 flag를 준다.
Calculator
숫자를 할당해 줄때에는 0x60만큼 할당을 받지만 , modify 함수에서 0x100만큼 쓸 수 있다. 오버플로를 사용해서 다음 청크의 사이즈를 바꾸고, free를 하면 , main_arena 주소를 얻을 수 있다(free 해도 show 해줌). 그리고 기본적으로 UAF가 되기 때문에 fastbin attack을 이용해 malloc_hook에 one gadget을 넣어주었다.
Array
수를 입력 받고 , 인덱스를 두 개 입력받아서 서로 교환을 한다. 하지만 경계 검사가 없기 때문에 oob가 되고, 이를 이용하여 미리 free해둔 청크에서 main arena값을 가져와서 출력해주고, free 된 fastbin(0x70) 청크의 fd를 malloc_hook-35으로 바꾸어준다. 이를 이용해서 malloc hook에 청크를 할당한다.
여기서 문제가 약간 생기는데, 청크는 malloc hook-35에 할당되기 때문에 4byte 단위인 인덱스를 깔끔하게 맞추는 것이 좀 어려웠다. onegadget을 잘라서 어떻게 잘 붙이면 되긴 한다. 아래 코드에 있는 2046820352가 이를 보여준다. 이는
16진수로 0x7a000000인데 one gadget의 마지막 1바이트가 0x7a이기 때문에 이를 맞춰주기 위해서 이런 수를 입력한 것이다. 페이로드를 보면 정신없는 것 처럼, 정신 없게 풀어서 설명하기 어렵다... 상당히 복잡한게, aslr로 스택 주소 바뀌는게 10진수로 보면 음수가 나올때도 있어서 unsigned 처리도 했어야 했다.. !
옴팡이
steghide라는 툴을 이용해서 숨겨진 flag 파일을 얻을 수 있었다. 힌트가 나오자 마자 문제가 10점이 되는 놀라운 광경.
LOL
double free와 free된 청크도 보여준다는 점을 이용해서 쉽게 풀릴 것 같았으나, 챔피언 레벨이 18이상 되면 exit 되었고 (행동을 하면 lv +1 됨) gold 제약도 있었기 때문에 fastbin attack을 통해서 챔피언 구조체가 할당된 곳을 재 할당받아 lv을 음수로 바꿔주고 편하게 double free를 통해서 malloc hook을 덮어씌웠다. 생각대로 안되서 약간 당황한 문제였다.
최근에 제이스로 우르곳한테 신나게 털린적이 있는데 기억폭행은 덤이다.
String Converter
출제자의 실수로 인해서 상당히 쉽게 풀었던 문제였다(꾸벅).
파란펜으로 된 부분은 개행문자를 null로 바꿔주는 부분인데 일단 이부분이 작동을 잘 안하고, strlen을 통해서 입력 받을 수 있는 최대 크기를 지정해주는데, 이때 topchunk까지 같이 길이에 들어가서 2byte overflow가 발생한다.
이를 이용해서 chunk overlapping을 시켜주고 , 꽉꽉 채워서 printf로 leak도 해주고 , free 된 fastbin의 fd도 조작할 수 있다! 이를 통해서 malloc hook을 one gadget으로 덮어서 쉘을 땄다. 역시 chunk overalp은 만능인것 같다.
Hobby
시간이 좀 걸렸던 문제기 때문에 약간 자세하게 적는다. 일단 이 문제의 취약점은 2가지 이다.
Edit을 통해서 수정할때 경계검사를 하지 않는것. 이를 통해서 heap에 특정 주소를 적고 edit에서 index를 잘 넣어줘 그 특정 힙을 가르키면 특정 주소의 값을 변조가 가능하다. 그리고 두번째, unsorted bin attack이 가능하다.
그리고 show함수는 숨겨져 있고 0x602100에 값을 적어야만 사용이 가능해진다.
따라서 미리 청크에 값들좀 넣어두고(unosrted bin attack하면 할당 못받으니까) unsorted bin attack으로 0x602100에 값을 주고 show함수를 통해서 heap과 libc 를 릭한다. 그리고 여기서 heap과 0x6020c0(전역변수)의 오프셋을 잘 계산해서 위에서 말한 방법으로 원하는 곳을 edit해 줘야한다. 그런데 여기서 malloc hook에 one gadget을 덮으면 안먹혀서 free hook에 덮어줘야 한다. 밑의 익스 코드에서 of2는 무시해도 된다. 이 문제는 onegadget 아니면 system으로 쉘따기는 힘들것 같다..
FastFood
내 문제인데, 문제를 잘못만들었다. 지금까지 한걸 다 종합해서 공부하려다 보니 겁나 이상한 문제가 되버렸다.
풀이가 길어서 따로 첨부한다.
요약하면 unsafe unlink를 통해서 leak과 unsorted bin attack을 발생시키고, 이를 통해서 global max fast값을 변조해서 free hook -> calloc , malloc hook -> leave ret으로 변조, 그리고 exit함수의 free 루틴을 위한 initial까지 변조해서 calloc을 통한 rop를 하는 문제이다.
https://osoriselfmanage.tistory.com/38
'전공쪽 > 동아리 관련' 카테고리의 다른 글
atoi 함수 우회 가능 문자 (0) | 2020.11.30 |
---|---|
앞으로 스스로 공부할 것 (1) | 2020.10.24 |
[동아리CTF] FastFood Write-up (0) | 2020.10.02 |
FSB를 위한 함수 (0) | 2020.08.31 |
StackPivot 문제 (1) | 2020.07.31 |