함수 호출 규약

Technique 2022. 1. 16. 16:14

요약 - cdecl - fastcall - stdcall 정의 "함수를 호출할 때 파라미터(인자)를 어떤 식으로 전달하는지에 대해 정해놓은 일종의 약속 용어 : caller -> 함수를 호출한 쪽, callee -> 함수 호출을 당한 쪽 cdecl - 주로 C언어에서 사용되는 방식 - caller에서 스택을 정리한다. 예를들어 main이 A라는 함수를 호출했다면 main이 자신이 스택에 입력한 함수 파라미터를 직접 정리 - 장점 : 가변 길이 파라미터를 전달할 수 있다. stdcall - Win32 API에서 사용되는 방식 - callee가 스택을 정리함 - stdcall으로 컴파일 하고 싶을때는 _stdcall 키워드를 붙여주면됨. - 장점 : 코드의 크기가 작아진다. fastcall - 기본적으로 s..

Heap Fengshui

Technique 2022. 1. 13. 14:46

요약 - Heap 영역에 할당된 청크의 레이아웃을 조작하는 기술 - Exploit의 정교함을 높이는데 중요한 역할 - 공격자가 프로그램의 실행 흐름을 조작할 수 있어야 함. - Heap 영역에 원하는 값을 쓸 수 있어야 한다. - Heap spary의 조건을 만족하여야 함 - UAF(Use After Free)를 이용한다고 생각하면 편함 참조 - https://www.lazenca.net/display/TEC/12.Heap+Feng+Shui#google_vignette 12.Heap Feng Shui - TechNote - Lazenca.0x0 Excuse the ads! We need some help to keep our site up. List Heap Feng Shui Heap Feng Shui란..

Return To CSU(A.K.A RTC)

Technique 2022. 1. 6. 14:16

요약 - ROP를 위한 가젯이 존재하지 않을때 사용 가능(예를 들어 pr, ppr, pppr 등등) - __libc_csu_init 내의 로직을 이용하여 레지스터에 값을 저장 분석 바이너리는 HackCTF의 RTC 바이너리를 기준으로 설명 0x4006a0 부분을 보면 R13, R14, R15D의 값을 각각 RDX, RSI, EDI에 저장하고, r12+rbx*0x8의 주소값을 호출 하는것을 볼 수 있다. 또한 0x400b6b에서는 레지스터들의 값을 pop하는것을 볼 수 있다. 따라서 0x4006a0 부분을 이용하여 원하는 인자를 넣고, 0x4006b6을 호출하면 끝 Jsec님이 이러한 rtc를 쉽게 사용할 수 있는 함수를 작성하였다. 해당 함수를 보면 add rsp, 0x8을 넘기 위해 'A'*8을 작성하..

Article Thumbnail
pwntools - ret2dlresolve

Technique 2021. 12. 13. 19:34

Return to dl resolve 공격을 할때, 공격을 좀더 쉽게 해주는 라이브러리? 이다. https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html pwnlib.rop.ret2dlresolve — Return to dl_resolve — pwntools 4.7.0 documentation A Ret2dlresolvePayload object which can be passed to rop.ret2dlresolve docs.pwntools.com from pwn import * context.binary = elf = ELF('바이너리') rop = ROP(context.binary) dlresolve = Ret2dlresolvePayload(elf, ..

Return to dl resolve

Technique 2021. 12. 13. 01:48

요약 Lazy binding을 악용하여 원하는 함수를 호출할 수 있는 공격. _dl_rumtime_resolve 함수를 조작된 reloc_arg 로 호출 하여 원하는 함수를 호출 하도록 하는 기법 사전지식 Lazy binding Dynamic Linking 방식으로 컴파일 된 ELF 바이너리는 공유 라이브러리 내에 위치한 함수의 주소를 동적으로 알아오기 위해 GOT(Global Offset Table) 테이블을 이용하는데, 이렇게 모든 외부 함수의 주소를 한 번에 로딩하지 않고, 함수 호출 시점에 해당 함수의 주소만 공유 라이브러리로부터 알아오는 것은 Lazy Binding이라고 합니다. Lazy binding을 사용하면 라이브러리의 내용을 전부 메모리에 매핑하는게 아닌 실행때 필요한 함수의 주소만 알아..

Article Thumbnail
gdb로 C++ 바이너리 분석시 함수 깨질때

Technique 2021. 12. 2. 01:51

set print asm-demangle on

실행중인 프로세스를 gdb에 부착하는 방법

Technique 2021. 10. 6. 16:05

p = process~~ print(util.proc.pidof(p)) pause()

pwntools에서 debug 및 ld_preload 사용법

Technique 2021. 10. 6. 16:03

process(["binary"], env={'LD_PRELOAD':'./libc.so.6'}) context.arch="amd64" or "x86_64" context.log_level='debug'

레지스터 종류

Technique 2021. 10. 2. 14:29

'rax' - 가장 중요한 레지스터로 시스템 콜의 실질적 번호를 가리키는 번호, 함수 결과값이 담기는 레지스터 'rbx' - base register로 메모리 주소를 지정할 때 사용 'rcx' - 보통 반복문에 사용 'rdx' - 데이터 레지스터로 연산 수행할 때 rax 와 많이 사용함 여기 위 네개의 레지스터를 '데이터 레지스터'라고 합니다. 다음 네개는 '포인터 레지스터' 입니다. 이 레지스터들은 특정한 주소를 가리킵니다. 'rsi' - 메모리를 이동하거나 비교할 때 출발주소을 가리키는데 사용 'rdi'- 메모리를 이동하거나 비교할 때 목적지 주소를 가리키는데 사용 'rbp' - 함수 파라미터나 주소를 가리킬 때 사용 'rsp' - 중요, stack의 삽입 및 삭제 명령어에 의해서 변경되는 스택 가장..

Heap Spray

Technique 2021. 10. 1. 23:17

요약 Heap 영역을 확장하며 해당 영역에 특정 값으로 가득 채우는 기술 Heap Spray로 인해 대부분의 아키텍처에서 대규모 Heap이 할당되는 시작 위치 예측 가능 Heap spray는 응용 프로그램에서 Heap 영역의 값을 읽어 해당 주소도 이동하는 함수 포인터를 덮어쓸 수 있는 취약성이 있을 경우에 사용 Heap Feng shui에도 사용됨 Heap 전체에 내가 원하는 코드를 골고루 위치시켜서 예측 가능한 공간에 Payload를 구성하기 위한 기법 예제 예제 코드 //g++ -o heapspray heapspray.cpp -ldl #include #include #include #include #include #include class UAF { char memo[160]; public: UAF..

Article Thumbnail