목록CTF/Pwnable (11)
안 쓰던 블로그
size를 입력 받은 다음 데이터를 입력 받는 문제 소스코드를 보면, get_shell함수가 보이고 main에 buf, size 등이 있다 메모리에는 다음과 같이 들어갈 것이다 생략 .... size buf main's sfp main's ret 전형적인 bof문제같이 보이는데, 한 가지 문제가 있다면 if문에서 너무 큰 사이즈를 넘겨버린다는 점이다 그냥 무작정 256를 넘는 범위를 보내면 if문에서 걸러진다 그러면 어떻게 size를 주어야 if문에 안 걸리고 256이 넘는 데이터를 보낼 수 있을까? 드림핵에 이 강의(dreamhack.io/learn/2/12#11)를 참고하라고 하면서 힌트를 준다 int범위는 -2^31 ~ 2^31-1 의 범위를 갖는다 또한 int같은 변수들은 최대 범위를 넘어가면 다..
64bit의 인자 32bit 아키텍쳐에서는 함수 호출시 인자를 스택에 저장했다 64bit에서는 함수의 인자를 레지스터 6개와 스택에 저장한다 인자를 저장하는 순서는 다음과 같다 ---레지스터--- rdi: 첫 번째 rsi: 두 번째 rdx: 세 번째 rcx: 네 번째 r8: 다섯 번째 r9: 여섯 번째 ---스택--- r10(%rsp): 일곱 번째 r11, 0x8(%rsp): 여덟 번째 ... 예를 들어 만약에 이런 printf코드가 있을 때 printf("%d %d %d %d %d %d", 1,2,3,4,5,6); gdb로 디스어셈블한 결과는 아래처럼 된다 ... push 0x6 #7번 인자, 스택에 저장 mov r9d, 0x5 #6번 인자 mov r8d, 0x4 #5번 인자 mov ecx, 0x3 #..
gdb 켜서 전역변수 리스트 확인 /bin/sh 주소인 0x0000000000004038 확인 함수 정보 확인 main, nothing, vuln main확인 vuln 함수가 있다 vuln 함수 확인 read를 사용했다 nothing 확인 첫 번째 인자를 받는 레지스터인 rdi rdi를 push rdi를 pop후 return rdi에 원하는 값을 넣으면 return되면서 되겠다 pop rdi 가젯: pop rdi; ret 가젯을 이용하여 첫번째 인자를 받는 레지스터인 rdi에 전역변수 sh의 주소를 넣은 뒤 system 함수를 ret 하면 쉘이 실행 됩니다. 익스플로잇 코드 먼저 ida등에서 버퍼가 16이라는 사실을 알고 있다 16+8=24만큼 더미를 넣는다 하지만 64bit는 다르다... 64bit에서..
ROP란 ROP(Return Oriented Programming)란 공격자가 실행 공간 보호(NX-bit) 및 ASLR, ASCII Armor나 코드 서명(Code signing)과 같은 보안 방어가 있는 상태에서 코드를 실행할 수 있게 하는 기술이다. 취약한 프로그램 내부에 있는 기계어 코드들의 섹션(가젯: Gadget)을 이용하여 공격 시에 특정 명령을 실행시키는 식으로 수행한다. ROP는 RTL, RTL Chainging Calls, GOT overwrite의 3가지 기법으로 이루어져 있다. 보호기법 NX-bit(Not Excutable, DEP) 아까 ROP란 실행 공간 보호(NX-bit)같은 보안 방어가 있는 상태에서 코드를 실행하여 공격한다고 할 때 등장한 보호기법. NX-bit는 가상 메모..
x86에서 x64가 되면서 구조 뿐만 아니라 스택에도 변화가 생겼다 레지스터 사용법 변화 1) 레지스터 이름 및 크기 변화 EAX(4바이트)->RAX(8바이트) EBX(4바이트)->RBX(8바이트) EBP(4바이트)->RBP(8바이트) 앞에 e가 붙으면 x86의 레지스터(32비트), r이 붙으면 x64의 레지스터(64비트)이다 그리고 e~는 4바이트, r~은 8바이트이다 x86에서 x64가 되면서 레지스터 이름과 크기가 변화했기 때문인데, 그렇기 때문에 e~가 사용되지 않는 건 아니다. eax라는 건 rax 레지스터의 하위 4바이트를 의미하는 이름이라고 알면 된다 2) 새로운 레지스터 추가 x86에서는 없던 레지스터 R8, R9 ... R15가 추가되었다 이 중에 R12~15는 비휘발성 레지스터(Non-..
전에 리버싱 공부하면서 레지스터를 정리한 적이 있다 foxtrotin.tistory.com/266 다시 기억할 겸 정리 레지스터는 CPU 내부에 존재하는 작고 고속인 다목적 메모리이다 종류로는 범용, 세그먼트, 상태 플래그, 명령 포인터 등등.. 이 있다 범용 레지스터는 논리, 수리 연산에 사용되는 피연산자, 주소를 계산하는 사용되는 피연산자, 메모리 포인터가 저장된다 세그먼트 레지스터는 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트를 가리키는 주소가 들어 있다 (세그먼트?: foxtrotin.tistory.com/312) 플래그 레지스터는 프로그램의 현재 상태나 조건 등을 검사하는 데 사용되는 플래그들이 들어 있다 명령 포인터(인스트럭션 포인터)는 다음에 수행해야 하는 명령이 있는 메모리 상의 주소가..