
동아리에서 '포너블을 위한 어셈블리 기초 및 디버깅'을 주제로, 포너블 스터디에서 발표했는데 블로그에도 소개하면 좋을 것 같은 내용을 들고 왔다. 이번 내용은 스택과 스택 프레임에 대한 내용으로, 스택에 데이터가 어떠한 방식으로 쌓이는지를 이해할 수 있을 것이다. 먼저, 스택의 역할을 소개한다. 스택은 함수 호출을 위한 주소 값을 저장하고, 함수를 호출할 때의 인자 및 지역 변수가 이 세그먼트에 저장된다. amd64 기준으로, 함수 인자는 RDI->RSI->RDX->RCX->R8->R9 순으로 레지스터를 사용한다. 만약, printf와 같이, 함수의 인자 개수가 제한이 없는 경우는 어떨까? // https://code.woboq.org/userspace/glibc/stdio-common/printf.c...

1. pwntools process 포너블(바이너리)을 풀다 보면, 다음의 스켈레톤 코드를 자주 쓴다. from pwn import * p = process('./binary') p.interactive() 그런데, process의 인자 두 가지를 더 줄 수 있다! p = process('./binary', aslr=0, env={"LD_PRELOAD":"./libc.so"}) gdb로 프로그램을 실행시키면, 해당 프로세스에서만 ASLR이 작동하지 않는 것처럼 alsr=0 옵션을 주면, 해당 프로세스를 실행시킬 때, ASLR 작동을 못 하게 해서 디버깅을 더 쉽게 할 수 있다. 그런데 최근에 call-of-cake 문제를 풀면서, aslr=1과 aslr=0의 메모리 환경이 달라져서 이에 주의해야 한다. ..

House of Lore malloc 함수의 smallbin에 해당하는 chunk의 재할당과 smallbin에 배치하는 과정을 이용한 공격 기법이다. [1] [2] [3] 제약 조건 1. Smallbin에 들어간 chunk의 bk를 조작할 수 있음 2. 다음과 같은 구성을 만들어야 함(= Heap leak이 선행됨) 소스 코드와 함께 파악하는 원리 glibc 2.23 / malloc.c [4] if ((victim = last (bin)) != bin) { if (victim == 0) /* initialization check */ malloc_consolidate (av); else { bck = victim->bk; if (__glibc_unlikely (bck->fd != victim)) { er..

데니스 유리체프가 저술한 "모두를 위한 리버싱 지침서 2/e"에 적힌 내용이다. 알아둬야 할 상식 같아서 포스팅하려고 한다. 1. 기본 4가지(cdecl, stdcall, fastcall, thiscall) cdecl은 스택을 통해 인자를 전달하되, 호출자가 스택을 정리하는 방식을 의미한다. 반대로, stdcall은 피호출자가 스택을 초기 상태로 복구하는 방식이다. 두 방식의 차이는 다음 예시에서 더 정확히 볼 수 있다. push arg3 push arg2 push arg1 call function add esp, 12 △ cdecl 방식 push arg3 push arg2 push arg1 call function functions: ... do something ... ret 12 △ stdcall ..