김도현(H3X0R) 발표자님
-
맥북에어 추모
-
cat profile.txt
-
시스템 해킹을 시작하고 싶으신 분
-
이미 시스템 해킹 공부를 하고 있지만 아직 여러가지 공격기법들이 완벽하게 이해 X
-
CTF에서 한문제라도 풀고 싶으신 분
-
C, Asm 알아보기
-
IP(or PC) : Instruction Pointer, Program Counter (인스트럭션 포인터 -> 다음 실행할 명령을 가리킴)
-
BP : Base Pointer
-
SP : Stack Pointer (스택주소 연산에 사용)
Flags, Segment Register
-
함수의 지역 변수, 복귀 주소등을 저장
-
함수의 실행이 끝나면 사라짐
-
LIFO 구조
크레인, 쌓인 컨테이너, 사람 그림으로 알아보자.
-
SP: 크레인 -> 스택의 맨 위를 가리킴
-
BP: 작업하는 사람
-
위로 자라는 스택(스택의 위로 올라갈수록 주소값은 낮아짐, 아래로 내려갈수록 주소값은 높아짐)
-
컨테이너를 뺄 때는 위에 있는 컨테이너부터
함수가 데이터를 사용할 때 기준이 되는 레지스터
call 인스트럭션은 아래 두 명령어를 한꺼번에!
-
push
EIP+인스트럭션마다 가지고 있는 값(call의 경우 1바이트)+(실행할 함수의 주소값)
-> EIP값을 저장 -
jmp
me_baby(실행할 함수로 이동)
함수 호출규약
- CDECL
- FASTCALL
push ebp
mov ebp, esp
함수 프롤로그
mov eax, [ebp+8]
mov ebx, [ebp+c]
함수에서 인자값을 가져올 때는 EBP를 기준으로 인자를 가져옴
leave
ret
EIP 저장한 값으로 복구, EBP 복구
-
RSI
-
RDI
-
RDS
-
RCS
핵심은 인자를 잘 구성해주고 (못들음)
-
라이브러리를 사용하기 위해 메모리에 덤핑
-
리턴 투 다이내믹 링크 등의 공격에 응용 가능
void *mmap(void *adder, //어디에?
size_t length, //길이값
int prot, //권한
int flags,
int fd,
off_t offset
);
mprotect(void *adder,
size_t len
int prot //어떻게?
);
-
정말 LIBC를 사용해야 하는지 바이너리를 살펴보고 확인해본다.
-
libcdb를 이용한다.
-
위 방법을 써본다.
이번 코드게이트 CTF 문제에서도... http://314hack.tistory.com/entry/Codegate-2018-Write-up-melong-BaskinRobins31-RedVelvet-ImpelDown
-
strace, ltrace : 익스플로잇에 문제가 생겼을 시 붙여서 원하는 방향으로 잘 가는지
-
pwntools : 포너들에게 필수인 파이썬 라이브러리(시스템 해킹계의 스위스 아미나이프)
-
pwndbg : heap 관련 명령어가 편함
-
qira
-
qemu : x86, x86-64가 아닌 바이너리 같은 경우 애뮬레이팅하기 좋음
-
ida