[HITCON training] lab 12 secretgarden
2021. 5. 11. 22:12
Wargame/etc
1. 문제 main 함수 add() 함수 - 0x28만큼 malloc() 할당한 후 변수 s에 반환된 포인터 저장 - 입력받은 size 만큼 malloc() 할당 후 변수 buf에 반환된 포인터 저장 - (DWORD)s에 1을 저장하고, (QWORD)s+1에 buf 값을 저장하고 (char*)s +16에 문자열을 저장한다.(color) - &flowerlist(전역변수) + size(HIDWORD)에 s 값을 저장하고 flowercount(전역변수) 값을 증가시킨다. struct flower{ int vaild ; char *name ; char color[24] ; }; 사실 flower 구조체를 위해 처음에 0x28만큼 malloc() 할당한 것이다. flower->valid 에 1을 넣은 것 flo..
[HITCON training] lab 5 simplerop
2021. 4. 12. 14:43
Wargame/etc
1. 문제 NX bit 만이 걸려있다. + ASLR 도 같이 고려해야 한다! read 함수를 통해 입력을 받는데, 버퍼 크기보다 더 큰 100 byte 만큼 입력을 받아 bof가 발생한다. 기본적인 x86-rop 문제겠거니 하고 offset 들을 구하려는데, leak이 되지 않았다. 이 문제의 경우 static link 방식이라서 system 함수를 이용할 수 없었던 것이다. 그럼에도 NX와 ASLR 이 적용되어 있으므로 rop 기법을 이용해서 exploit 하는 것이 최종 목표일 것이다. 이때, mprotect()를 이용한 rop가 가능하다. -> shellcode를 써놓고, 그 영역에 실행 권한을 줘서 exploit하는 방식 2. 문제 해결 과정 mprotect함수 int mprotect (void ..
[codegate quals 2018] - BaskinRobins31(basic x64)
2021. 4. 4. 23:53
Wargame/etc
1. 문제 보호 기법을 확인해보니 NX bit만 걸려있는 상황이다. 파일을 실행해보니 말 그래도 basinrobins31 게임을 한다. my_turn 함수과 your_turn 함수를 살펴보도록 하자. your_turn 함수를 살펴보니 read 함수로 입력받은 부분에서 overflow가 발생함을 알 수 있다. 다음과 같이 해서 쉘을 획득할 수 있을 것 같다. 1. 쓰기 가능한 영역에 binsh 저장 2. write 함수로 read_got leak 시킴 3. leak된 주소 받아서 system 함수 주소 구하고, got overwrite 함 4. read 호출하면 system 함수 호출되서 쉘 획득 gadget 세개짜리 (ret) 인자 1 인자 2 인자 3 함수 호출 gadget 세개짜리 (ret) . . ..
[pliadCTF 2013] - ropasaurusrex(basic x86)
2021. 4. 3. 21:40
Wargame/etc
1. 문제 NX bit 만이 걸려있음을 알 수 있다. NX bit + ASAL이 걸려있는 상황이다. 파일을 실행해보니 단순히 입력을 받고, "WIN"을 출력한다. 다음은 ida로 까본 모습이다. main이 상당히 심플하다. read 함수로 입력을 받는데, 버퍼 크기보다 더 크게 입력받아 overflow가 발생한다. 우리의 목표는 system 함수로 binsh을 실행시키는 것이다. 그런데, ASLR로 인해 system 함수, binsh의 주소를 모두 모르고 문제에서 주소가 leak 되지도 않는다. 이런 상황에선 어떻게 쉘을 획득할 수 있을까? lazenca rop x86에서 적용했던 기법을 생각할 수 있다. 일단 우리가 이용할 수 있는 것은 read, write 함수이다. -> gadget을 이용해 위 함..
[HITCON training] lab4 ret2libc
2021. 3. 21. 20:45
Wargame/etc
1. 문제 NX 만 걸려있어 RTL 문제임을 알 수 있다. 주소를 10진수 형태로 입력하면 그 주소의 내용을 출력해준다. 만약 이중 포인터 값을 넣어주면 또 다시 주소를 출력할 것이다. 여기서 뭔가 leak이 될 것 같은 강한 예감이 든다..! 그리고 메시지를 입력하라고 하고 입력한 메시지를 출력해주는 형태이다. 처음에 주소를 10진수 형태로 입력받고, 16진수로 변환해준 다음 이중포인터인 v8에 저장한다. 그리고 v8을 인자로 하는 See_something 함수가 실행된다. See_something 함수이다. 입력받은 주소의 내용을 %p 형태로 출력한다. Print_message 함수이다. 여기서 bof 취약점이 발생한다. dest 버퍼의 크기는 56 byte 지만, 256 byte 짜리 src를 de..