[Pwnable] Heap2
2021. 5. 5. 22:09
Hacking/Pwnable
Chunk Malloc에 메모리 할당을 요청하면 넓은 메모리의 영역("힙")을 다양한 크기의 덩어리("chunk")로 나눈다. 32bit에서는 해당 청크가 8byte 단위로 할당이 되고, 64bit에서는 16byte 단위로 할당된다. 일반적으로 malloc()을 호출하고 반환되는 주소를 이용하여 데이터를 입력하게 되는데, 사실 반환되는 주소는 청크의 시작부분이 아닌 페이로드의 주소이다. 페이로드바로 위에 meta-data를 포함하는 청크 헤더가 존재한다. 이 헤더에서 현재 청크의 사이즈가 몇인지, 인접한 청크의 사이즈는 얼마인지가 들어있다. Chunk는 크게 3가지 타입을 가진다. - In-use chunk : 애플리케이션에서 할당받아서 사용중인 덩어리 - Free chunk : 응용프로그램에서 시스템에..
[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을 이용해 위 함..
[Pwnable] python으로 인자 및 stdin 전달
2021. 4. 1. 17:42
Hacking/Pwnable
1. shell에서 python으로 바이너리에 stdin 전달 (python -c 'print "A"*10';cat) | 2. shell에서 python으로 바이너리에 인자 전달 ./program `python -c 'print "A"*10'` 3. gdb에서 python으로 바이너리에 stdin 전달 r < 만약 로컬이 아닌 서버에 접속해야 할 경우, 뒤에 | nc (접속정보) 를 붙여준다.
[HackCTF] RTL_Core
2021. 3. 31. 22:11
Wargame/HackCTF
1. 문제 NX 비트가 걸려있음을 알 수 있다. 처음에 gets 함수를 통해 입력을 받는데, 입력받은 것을 check_passcode() 인자로 넘겨서 반환되는 값이 hashcode와 같을 경우 core() 함수를 실행한다. gets로 받은 인자(a1)를 반복문을 돌리는데, for 문을 통해 a1에 4씩 더하면서 4바이트 포인터로 형변환을 해준다. 그래서 a1부터 a1+16까지의 값을 누적시킨 v2를 반환해준다. (즉, for 문을 5번 반복하면서 전달받은 주소값을 기준으로 4bytes 씩 증가시켜 순차적으로 접근하여 해당 값들을 v2 변수에 더하여 반환한다.) 이때, v2는 hashcode의 값( 0xC0D9B0A7 ) 과 같아야 한다. 값을 같게 할 방법은 두 가지 정도 있다. 1) hashcode ..
[Pwnable] Lazenca - ROP(x64) 정리
2021. 3. 30. 01:35
Hacking/Pwnable
Return Oriented Programming(ROP) -x64 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다. RTL + Gadgets 이 기법에서 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고, "가젯(Gadgets)"이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요하다. 각 가젯은 일반적으로 반환 명령어(ret)로 끝이나며, 기존 프로그램 또는 공유 라이브러리 코드 내의 서브 루틴에 있다. Gadgets - POP; POP; POP; RET x86의 경우 pop 명령어..