[Pwnable] Lazenca - ROP(x86) 정리
2021. 3. 29. 19:23
Hacking/Pwnable
Return Oriented Programming(ROP) -x86 ROP( Return-oriented programming )란? 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다. RTL + Gadgets 이 기법에서 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고, "가젯(Gadgets)"이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요하다. Gadgets - POP; POP; POP; RET ROP는 기본적으로 RTL 기법을 이용하며, 공격자는 RTL과 Gadgets을 이용해 공격에 필요한 코드를 프로그래밍 하는 것이다. 01.RTL(R..
[Pwnable] PLT, GOT
2021. 3. 21. 20:48
Hacking/Pwnable
PLT, GOT example4의 디스어셈블리 결과를 보면 puts와 scanf 함수를 호출할 때 해당 함수의 라이브러리 코드 주소로 바로 점프하지 않고 PLT 영역으로 점프하는 것을 확인할 수 있다. Procedure Linkage Table(PLT)는 외부 라이브러리 함수를 사용할 수 있도록 주소를 연결해주는 역할을 하는 테이블이다. Global Offset Table(GOT)는 PLT에서 호출하는 resolve 함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테이블이다. ASLR이 적용되어 있는 환경에서, 동적으로 라이브러리를 링크하여 실행되는 바이너리(Dynamically linked binary)는 바이너리가 실행될 때마다 라이브러리가 매핑되는 메모리의 주소가 변한다. 따라서 PL..
[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..
[Pwnable] Lazenca - RTL(x64) 정리
2021. 3. 21. 01:49
Hacking/Pwnable
RTL(Return to Libc) RTL이란 Return address 영역에 공유 라이브러리 함수의 주소로 변경해, 해당 함수를 호출하는 방식이다. 해당 기법을 이용해 NX bit(DEP)를 우회할 수 있다. 이번엔 x64에서 RTL을 실습해볼 것이다. x86과 x64 차이는 쉽게 말해 x86은 32비트, x64는 64비트인것으로 구분을 하면 된다. 그렇다면 이번에도 먼저 함수 호출 규약에 대해 공부해보자! Calling Convention System V AMD64 ABI Solaris, Linux, FreeBSD, macOS 에서 "System V AMD64 ABI" 호출 규약을 사용하기 때문이다. Unix, Unix 계열 운영체제의 표준이라고 할 수 있다. Calling convention fe..
[Pwnable] Lazenca - RTL(x86) 정리
2021. 3. 20. 21:48
Hacking/Pwnable
RTL(Return to Library) RTL이란 Return address 영역에 공유 라이브러리 함수의 주소로 변경해, 해당 함수를 호출하는 방식이다. 해당 기법을 이용해 NX bit(DEP)를 우회 할 수 있다. RTL 이해하기 위해 잠깐 Calling Convention을 공부하고 가자! Calling Convention Cdecl(C declaration) 해당 호출 규약(Calling Convention)은 인텔 x86 기반 시스템의 C/C ++ 에서 사용되는 경우가 많다. 기본적으로 Linux kernel에서는 Cdecl 호출 규약(Calling Convention)을 사용한다. Calling convention features 인자 전달 방법 Stack을 이용 인자 전달 순서 오른쪽에서 ..
[Pwnable] Format String Bug
2021. 3. 18. 23:57
Hacking/Pwnable
포맷 스트링 버그는 대표적으로 printf와 sprintf와 같은 포맷 스트링을 사용하는 함수에서 사용자가 포맷 스트링 문자열을 통제할 수 있을 때 발생하는 취약점이다. 포맷 스트링에는 다양한 종류가 있고, 주어진 인자에 대해 각 포맷 별로 정해진 기능을 수행한다. 만약 공격자가 이러한 포맷 스트링을 조작할 수 있다면, printf 함수의 인자가 저장되는 스택의 내용을 읽거나 %n 혹은 %s 등 메모리 참조 포맷 스트링을 이용해 메모리 커럽션을 유발할 수 있다. 다음은 실습에 쓸 fsb.c 파일이다. // gcc -o fsb1 fsb1.c -m32 -mpreferred-stack-boundary=2 #include #include #include #include char flag_buf[50]; void..
[HackCTF] Basic_Bof - Simple_Overflow_ver_2
2021. 3. 13. 23:57
Wargame/HackCTF
1. 문제 1. 먼저 데이터 입력을 받는다. 2. buf 의 주소를 출력하고 입력받은 데이터도 출력한다. 3. 다시 실행할 건지 묻는다. 4. y를 입력하면 다시 데이터를 입력받게 되고, 동일한 주소를 출력한다. 5. 프로그램을 종료하고 다시 실행시키면 버퍼의 주소가 다르게 나온다. 2. 문제 의도 파악하기 scanf 입력 시 입력값 검증을 하지 않기에 bof를 일으켜 RET를 변경하면 될 것 같다. 즉 payload는 다음과 같을 것이다. Payload = "Shell code" + dummy 값 + buf의 주소 그리고 프로그램이 실행될 때 buf의 주소가 leak이 되기 때문에 exploit 코드에서 구해서 전달하면 될 것이다. 그렇다면 이제 offset을 구해서 중간에 그만큼의 dummy 값을 주..
[HackCTF] Basic_Bof - 내 버퍼가 흘러넘친다!!!
2021. 3. 11. 15:36
Wargame/HackCTF
1. 문제 의도 파악 지금 read와 gets 함수로 입력을 두 번 받고 있다. 그리고 gets 함수의 경우, 입력값 검증을 하지 않기에 buffer 크기인 20보다 더 크게 넣어 return address를 바꿀 수 있을 것이다. 그래서 쉘 코드를 어디에 넣을까 생각하다가, read 함수로 입력을 받는 name에 쉘 코드를 삽입하고 버퍼 s에 더미값과 name의 시작 주소를 넣어 쉘코드를 실행해보려 한다. 2. offset 구하기 name의 경우 50byte만큼 입력을 받는다. 따라서 쉘코드를 넣고 그 앞 뒤에 nop을 채워주면 될 것으로 생각된다. 그런데, 이때 name은 bss 영역이기 때문에 ASLR의 영향을 받지 않는다. 따라서 nop을 주지 않고, 쉘코드만 채워도 된다는 결론이 나온다. 그리고..