본문 바로가기

system/material

x86, x64 srop 정리

srop

x86, x64 srop 기법을 정리한다.

srop는 sigreturn return oriented programming으로, sigreturn system call을 사용하는 rop이다.

 

이 기법은 rop를 하기 위한 gadget이 부족할 때 요긴하게 사용할 수 있다.

 

이 기법을 이해하기 위해서는 user modekernel mode에 대해 알아야 한다.

프로그램은 보안, 자원 관리 등의 이유로 user modekernel mode를 왔다갔다 하면서 실행된다.

user mode는 접근할 수 있는 영역이 한정적이며, kernel mode는 모든 자원에 접근할 수 있다. 아직 제대로 공부한 적이 없어서 정확히 어느 부분이 한정적인지는 모르겠다. 보통 kernel mode에서는 signal을 처리한다고 한다.

 

때문에 user mode <-> kernel mode 가 이루어질 때, 자원의 공유가 필요하다.

 

user mode -> kernel mode: user hardware context를 kernel stack에 저장한다.

kernel mode -> user mode: setup_frame() 함수에 의해 user stack에 user hardware context가 저장되며 sigreturn syscall이 불려 user context를 셋팅한다.

 

즉, sigreturn system call을 통해서 레지스터를 셋팅해줄 수 있다는 것이다.

 

sigreturn은 sigcontext 구조체 형태로 user context를 바꿔준다.

 

sigcontext.h에 선언되어 있는 sigcontext struct는 다음과 같다.

find /usr/include -name "sigcontext.h" 2> /dev/null

  • 32 bit

  • 64 bit

 

  • 32bit poc

간단한 overflow이다. 하지만 함수가 존재하지 않고 가젯도 없어 일반적인 rop가 불가능하다. 이런 상황에서 srop를 사용할 수 있다. sigcontext struct에 맞춰 인자를 주면 된다.

 

gcc -o test test.c -m32 -fno-stack-protector -mpreferred-stack-boundary=2 를 사용하여 컴파일한 후 테스트 하도록 하자.

 

중요하게 값을 지정해야 하는 것은 얼마 안된다.

cs(code segment), ss(stack segment), ebx, ecx, edx, eip, esp, ebp를 잘 맞춰줘야 한다.

cs와 ss는 user mode와 동일하게 맞춰줘야 하고 ebx, ecx, edx에는 인자를, esp, ebp는 exploit plan에 맞춰 설정해주거나 0으로 해주면 된다.

 

근데 이렇게 /bin/sh의 주소와 int 0x80의 주소를 단번에 알 수 있으면 딱히 상관 없는데 원래는 int 0x80은 libc 함수 안에 존재하고( __kernel_sigreturn 함수도 마찬가지 ) /bin/sh도 데이터 영역에 써주지 않는 이상 libc에 존재해서 아직은 어느 때에 rop대신 써야하는지 확실히는 모르겠다.

 

  • 64bit poc

32비트와 달라진건 사이즈를 0x100으로 늘렸다는 것과 rax에 0xf를 넣어주는 기계어를 추가했다는 점이다.

gcc -o test test.c -fno-stack-protector로 컴파일한 후 테스트하도록 하자.

 

익스 과정에서 신기한 점은 sigreturn 함수가 32, 64비트 동작이 똑같아서 64비트여도 rdi를 인자로 받지 않고 스택을 인자로 받는다는 것이다.

 

참조

http://lclang.tistory.com/66

https://www.lazenca.net/display/TEC/01.SROP%28Sigreturn-oriented+programming%29+-+x86


'system > material' 카테고리의 다른 글

c++ std::string  (0) 2019.01.22
fastbin dup consolidate 정리  (0) 2019.01.22
glibc 2.26 tcache 동작 분석 및 exploit (how2heap)  (2) 2019.01.15
got_overwrite stack_smashing_detected  (0) 2019.01.12
unsorted bin free 동작..  (0) 2018.12.26