포너블

mips

mips rop

mips에서도 bof가 발생할 경우 rop가 가능하다. 하지만 x64 rop와 큰 차이점이 2가지 있다. 첫 번째로x64 rop는 pop rdi; ret ; pop rsi; pop rdx ; ret  뭐 이런식으로 rsp 가 움직이면서 인자 값을 레지스터에 딱 딱 넣는다. 그러나 mips의 레지스터에 값을 저장하는 방식은 sp를 기준으로 n만큼 떨어진 주소의 값을 가져오는 방식을 사용한다.즉, sp는 가만히 있고 a0 = [sp+0x10] , a1 = [sp+0x20] 이렇게 인자를 가져오기 때문에 가젯을 구하는게 상당히 힘들다.예를 들어서 가젯을 구했는데 a0의 값도 sp+0x10 에서 가져오고 a1의 값도 sp+0x10에서 가져온다면 두 가젯중 하나만 사용 가능해진다. 또한 깔끔한 가젯이 없기 때문에..

mips

mips shellcode

execve("/bin/sh",0,0) 를 실행하는 main 함수의 어셈블리 코드는 다음과 같다.mips도 execve 함수 내부에서 syscall 이 이루어진다.x64에서는 syscall이 호출되었을 때 rax 값에 따라 어떤 작업을 수행할 지 결정되는데 misp는 해당 역할을 v0이 수행한다. 인자 순서는 a0, a1, a2 순서이다.syscall 직전에 레지스터 값을 확인해보자.v0 : 0xfaba0 : "/bin/sh" 주소a1 : 0a2 : 0 이제 쉘코드를 만들어 보자. 다음과 같이 어셈블리코드를 짤 수 있다..section .text .globl _start_start: li $t0, 0x2f62696e sw $t0, ($sp) li $t0, 0x2f2f7368 s..

mips

mips 스택프레임, 레지스터, 어셈블리어

mips 스택프레임#include void a(){ char buf[0x30]; printf("this is a\n"); read(0, buf, 0x30); b();}void b(){ printf("this is b\n");}int main(){ printf("this is main\n"); a();}위 함수를 예제로 하여 설명해겠다. 프롤로그addiu sp, sp, -32sw ra, 28(sp)sw s8, 24(sp)move s8, spsp에 -32를 빼서 공간을 확보한다.sw ra, 28(sp) 로 sp + 28 에 ra를 저장한다. 이는 복귀주소를 저장해놓은 것이다. (ret)sw s8, 24(sp) 로 sp +..

mips

mips - 기본 개념

mips 란?Microprocessor without Interlocked Pipelined Stages 아키텍처 중 하나로 4byte 주소체계를 가진 RISC 기반 명령어이다.mips의 특징중에는 특이한 것이 하나 있는데 바로 "delay slot" 이라는 것을 사용한다.이는 branch 나 jump같은 분기 명령이 실행될 때 다음 줄 명령까지 실행한다는 것이다. 그렇기 때문에 rop 를 짤때 마지막 한 줄을 생각해줘야 한다.예를 들어서 다음 코드를 보자.1) lw gp,24(s8)2) li a0,13) lw v0,-32584(gp)4) move t9,v05) jalr t96) nop다음과 같은 어셈블리 코드가 실행이 된다고 치자. 원래같으면 1, 2, 3, 4, ..

포너블

Fortify mitigation

Buffer overflow와 같은 메모리 관련 취약점을 막기 위해 gcc와 같은 컴파일러에서 제공하는 보호기법이다. 이는 소스코드에서 잠재적인 취약점을 탐지하고 런타임에 추가 검사를 통해 보안 향상을 한다.버퍼 오버플로우가 감지되면 프로그램을 종료한다. SSP와 비슷한 느낌이지만 동작방식은 아예 다르다. 동작 방식Fortify의 동작 방식은 buffer overflow 가 발생할 때 감지할 수 있는 특정 C 라이브러리 함수의 향상된 버전을 제공하는 방식으로 작동한다. 다시말해 strcpy,  memcpy, sprintf, memset, fprintf 등의 함수를 사용하면 컴파일 과정에서 __strcpy_chk, __memcpy_chk 로 변경한다.이러한 취약한 함수가 호출되면 fortify는 사용중인 ..

포너블/Heap

heap exploit 공부하기 좋은 곳

사실 눈치 챘을 수도 있지만 지금까지 올라온 heap 블로그는 dreamhack의 Heap Allocator Exploit 강의를 기반으로 필자가 직접 공부하고 이해하며 이해하기 쉽도록 재구성하여 작성한 것들이다. 그래서 이전 블로그들은 매우 기본적인 공격 방법을 설명한 것이며 공격 조건이나 공격 방법 등의 것들도 정해져있는 것이 아니라 버전마다 바뀌기 때문에 익스플로잇 기법을 외워서 하기는 조금 힘들다. 그래서 추천드리는 사이트가 바로 how2heap 이다.https://github.com/shellphish/how2heap GitHub - shellphish/how2heap: A repository for learning various heap exploitation techniques.A repos..

포너블/Heap

Tcache memory leak

tcache에서 라이브러리 영역 주소를 릭하는 방법은 다음과 같다.1. 7개의 tcache_entry 를 꽉 채워 tcache를 사용하지 않도록 한 후 unsorted bin을 만든다. (fast bin에 들어가지 않을 크기여야한다.)// gcc -o leak1 leak1.c -no-pie#include #include #include int main(){ uint64_t *ptr[10]; int i; for(i=0;i 2. tcache에서 허용하지 않는 크기를 할당한 이후 해제해 unsorted bin 을 만든다.// gcc -o leak2 leak2.c -no-pie#include #include #include int main(){ uint64_t *ptr[2]; ptr[0] = malloc(0x4..

포너블/Heap

Tcache House of Spirit

공격조건fake chunk의 주소를 알아야 한다. 임의의 주소를 free할 수 있다. Tcache House of Spirit 이란?free 함수의 인자를 조작하여 임의의 메모리를 해제할 수 있을 때 사용할 수 있는 기법으로 원하는 주소에 힙을 할당해 임의의 주소에 값을 쓸 수 있다. 예시// gcc -o spirit1 spirit1.c -no-pie#include #include int main(){ long long fake_chunk[10] = {0,}; fake_chunk[0] = 0; fake_chunk[1] = 0x31; fake_chunk[2] = 0x41414141; free(&fake_chunk[2]); char *fake_alloc = malloc(0x20); printf("fake c..

K0n9
'포너블' 태그의 글 목록