목록Wargame/HackCTF (37)
Pwnstar
라업짜던게 다 날아갔다. 그냥 핵심적인 부분부터 다시 쓰도록 하겠다. show 부분의 밑줄 쳐진 if 문에서 oob 취약점이 터진다 이 부분을 이용하여 elf relocation table의 주소에서 ptr의 주소 0x602060를 뺀 값을 이용하여 got를 leak할 수 있다. 이렇게 leak에 성공하면 그 다음은 fastbin dup into stack 취약점을 이용하여 익스를 짜면 되는데 기본 아이디어는 다음과 같다. 1. a, b, c 이렇게 세 개를 malloc한다. 2. a -> b -> a 와 같은 순서로 free하게 되면 double free 에러가 뜨지 않은 상태에서 다음으로 넘어갈 수 있다. 3. 이후의 malloc으로 fd부분을 조작할 수 있고, 이 것을 이용하여 malloc hook..
문제 순서대로가 아닌 문제를 푼 순서대로 라업을 쓰려고 한다. 언익스2번도 1번과 거의 비슷한 문제이다. NX만 걸려있고, main함수 구성과, system plt가 존재하는 것까지 똑같은데, 1번과 달리 sh 문자열을 사용할 수가 없다. 지금 생각해보면 되게 멍청한 시도였는데 이 시도 덕분에 system 함수의 새로운 기능을 알게 되었다. main함수에도 보이듯이 sh 문자열이 존재하기는 해서 이 부분의 주소를 rdi에 넘겨주고 system 함수를 실행시켜 보았는데 문자열을 넣은 부분이 그대로 출력이 되었다. 혹시 system 함수가 puts나 printf 함수와 같은 기능도 할 수 있지 않을까 싶어서 이 함수를 이용해서 libc leak을 해보았다. 예상대로 libc leak에 성공했다. 어쩌다 얻어..
원래 HackCTF도 라업을 전부 쓰려고 했었는데, 굳이 안그래도 되는 문제들이 많아서 이전 문제들은 제끼고 언익스 1번부터 쓰려고 한다. 보호기법은 NX만 걸려있다. main 함수는 상당히 짧다. 변수 s의 크기가 0x10인데 fgets함수로 64만큼 입력을 받으니 쉽게 bof가 가능할 것 같다. gift라는 함수에 system_plt도 있으니 rdi에만 제대로 값을 넣고 넘겨주면 될 것 같다. 그런데 문제는 /bin/sh\x00 문자열을 입력받고 넣어주기에는 64바이트가 충분하지 않을 것 같아서 /bin/sh나 sh문자열이 또 따로 존재하는 지 찾아봤다. /bin/sh 문자열은 있었으나 libc에 있었고, 이 libc를 leak하기에는 또 칸이 모자랄 것 같아서 sh를 찾아보니 0x4003bf 주소에..
열번째 문제이다. 이전 문제들보다 훨씬 푸는데 오래 걸렸다.. 현재 문제풀던 환경이 16.04여서 ubuntu 18.04환경에서 따로 진행하였다. 64비트 바이너리이고, NX만 걸려있다. 우선 IDA로 열어보니 이전의 문제들과는 다르게 코드가 길었다. 일단 show me your number라는 문구와 함께 숫자를 입력하고, 조건이 맞춰지면 follow me가 뜬다. 만약 조건과 맞지 않으면 이렇게 뜨면서 종료된다. 이 숫자를 맞추기 위해서 처음에는 저 마지막 if 문 안에 있는 숫자를 유추하려고 했었다. 그런데 생각해보니 그럴 필요가 없는게 gdb에서 내가 입력한 숫자와 비교하는 부분을 보면 되는 일이었다.. 그래서 한번 시도를 해보았다. 해당 부분에 break point를 걸고 아무 수나 입력해보았다..
아홉번째 문제이다. 문제 이름 그대로 버퍼오버플로우인데 PIE가 걸려있는 게 아닐까 생각했다. 우선 32비트 바이너리이고, 역시나 NX와 PIE가 걸려있었다. 때문에 코드 영역을 포함한 모든 영역이 랜덤하게 배치된다. IDA 메인 함수에는 누가 봐도 수상한 welcome이란 함수가 있었고, j0n9hyun이란 함수는 flag를 열 수 있게끔 되어있었다. 메인함수가 시작되고 곧장 실행되는 welcome함수는 welcome 함수의 주소를 알려주고, 입력을 받는 형태로 되어있었다. 너무 당연하게 0x12 + 0x4 = 22만큼의 dummy 뒤에 j0n9hyun 함수 주소를 줄 수 있을 것 같았는데, PIE 때문에 함수의 base 주소가 매번 실행할 때마다 달라지기 때문에 이 base 주소와, j0n9hyun ..
여덟 번째 문제 우선 32비트이고, Full RELRO여서 GOT overwrite 불가능, NX 때문에 쉘코드 삽입 불가능, PIE 때문에 모든 섹션이 랜덤하게 재배치된다. IDA로 열어보면 메인함수는 어떤 함수를 call하겠냐는 질문과 받은 입력을 select_func에 인자로 준다. select_func 함수는 인자로 넘겨받은 입력을 "one" 문자열과 비교하여 같으면 one 함수를 실행시켜 준다. 함수 목록에 보면 one 함수, two 함수, print flag 함수 등등이 있는데 one 함수와 two 함수는 별것 없다 그냥 이 함수는 one 함수다 two 함수다 라는 것만 알려준다. 이제 이 함수로 어떻게 가느냐가 관건인것 같은데 처음 이 문제를 풀 때 너무 어렵게 생각해서 시간을 많이 잡아먹었..
일곱 번째 문제이다. 일단 오버플로우라고 하는 것 보니 버퍼 오버플로우겠지?? 이 문제는 다시 32비트이고, 아무런 보호기법도 걸려있지 않다. 음....이제 bof 문제가 하도 많이 나오다보니 단순한 문제가 아닐것 같긴한데 우선 IDA로 열어보겠다. 우선 쉘을 실행시키는 함수같은 것은 없었고 대충 입력을 받으면 그 입력을 받는 주소를 보여주고, 다시 입력을 받을 수 있는 구조인 것 같다. 이렇게만 봐서는 제대로는 모르겠어서 한번 실행해보았는데, s의 위치가 ebp-88h(136)이어서 136개 이상의 입력을 주면 segment fault가 뜰 줄 알았는데?? 뜨지 않았다. 그래도 뭐 eip를 덮을 순 있을테고, 버퍼의 크기도 136으로 충분한 것 같아서 이전 문제와 비슷하게 풀 수 있을 것 같았다. 버퍼..
여섯 번째 문제 이제 느끼는 거지만 bof문제가 참 많다.. 이것도 64비트 bof인 것 같다. 우선 아무런 보호기법이 걸려있지 않은 것을 확인했다. IDA로 열어보았다. 처음에 버퍼의 주소를 주고 gets로 입력을 받는다. 함수 목록을 확인해보니 shell을 실행시키는 함수도 없고, 그냥 쉘코드를 넣으면 될 것 같다. 그런데 입력을 받는 버퍼의 크기가 굉장히 크다. 6d30h = 27952 여기에 쉘코드를 넣고 ret에 버퍼의 주소를 주는 것도 좋을 것 같다. -> 버퍼의 주소를 주는 이유같다. 우선 버퍼의 주소를 출력해주면 그 값을 받아와서 저장하고, 이 값으로 돌아오면 되겠지?? 그리고 버퍼의 크기가 크니까 어디든 넣어놓으면 될 것 같다. 요렇게 버퍼의 주소를 가져올 수 있었고 총 버퍼크기 = 27..