Profile

머리정리하는곳

c2w2m2

SROP

SROP 는 매우매우매우 간지나는 ROP 로 Super ROP 의 약자다







이상 잡소리였고 Sigreturn Oriented Programming 의 약자고 int $0x80 과 eax 컨트롤 만으로 모든 레지스터를 컨트롤 가능하게 해주는 매우 갓ㅡ갓 기법인 거시다


SigReturn 는 커널모드 -> 유저모드 로 이동할때 호출되는것인데, 이때 유저모드의 레지스터를 세팅하게 된다.


세팅도중, 세팅하는 값에 대한 검증을 하지 않고 함으로써 우리는 SigReturn을 강제적으로 호출해 레지스터를 맘대로 바꿀수 있게 되는것이다.



사실 이 기법에 대해 알게된건 진짜루 진짜 오래 됬지만, SROP 중 /bin/sh 를 가젯으로 받지 않고 read 를 통해 bss 같은 영역에 쓰고 SigReturn 을 호출할 수 있는 방법에 대해 연구하다 머리 터질거 같아서 머리 식힐겸 SROP 관해서 정리하는것


먼저 이런 프로그램이 있다고 하면. 

버퍼의 크기가 8인데 비해 read 를 통해 0x80 만큼 받으므로 bof 가 일어나지만 아무런 가젯이 없어서 ROP 건 뭐건 못하는 상황인거시다..


이런 상황을 타파하게 해주는것이 바로 read 를 콜하기 위해 사용된 int $0x80 명령어이다.


read 같은 경우는 자기가 받은 buffer의 길이만큼을 eax 에 저장해주게 된다.


따라서 eax 같은 경우는 입력값의 길이를 조정해 줌으로 컨트롤 할 수 있고, bof 취약점이 존재함으로 eip 또한 컨트롤이 되므로

간단하게 SROP 를 할 수 있는거시다.




이것이 우리가 쓰게될 SigReturn 인 sigcontext이다. sigcontext.h 에 있으며 직접 찾거나

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

로 찾아서 한번 보자 밑에 인가 위에인가 64비트도 있음!! (헬게이트) 참고로 저거 돌려도 겁나 많이 나오니 나같은 경우는 맨 밑에껄로 찾았다


SigReturn 의 syscall number 는 

=> https://syscalls.kernelgrok.com/ <= 

요기서 찾을 수 있다 쉘코드나 어셈으로 작업할 때 유용한 사이트이니 꼭꼭꼭 북마크를! 



119 번 이랜다.

덤으로 하나 더 알고 가야하는건


이런걸 컴파일 하고



그냥 엔터만 눌러도 read 의 return 이 1 이되는것을 알 수 있고, 그 이유는 보이다시피 \x0a 가 들어간다.


고로 우리의 페이로드 길이는 118자이다.


이제 공격을 해봅시다



이런식으로 레지스터를 차례에 맞게 세팅해주고 


(python exp.py;cat) | ./srop


식으로 실행시키면 쉘이 뜬다.


주의할 점은 레지스터를 차례로 맞춰줄때 gs, fs, es, ds, cs, eflags, ss 같은 레지스터는 gdb로 레지스터 값을 보고 똑같이 맞춰줘야 하고, trapno, err, esp_at_signal, esi, edi 같은건 NULL 로 세팅해버리자


그 외 ebp, esp 같은경우는 이번처럼 execve를 call시키는 경우에는 필요없지만, read 나 write 같은 것을 call 할때는 제대로 맞춰주자. 지금은 그냥 bss 영역 주소를 0x100 간격으로 넣었다


마지막으로 eax, ebx, ecx, edx, eip 인데 eax 같은 경우는 call 하고 싶은 함수의 syscall number 로 맞추고

ebx, ecx, edx 를 함수에 따라 인자값으로 세팅해주고, eip 같은 경우는 다시 한번 int 80 을 가르키게 하여 execve 를 실행시킬수 있게 해주자.




쓱싹












/bin/sh 가 없을 경우에는 내가 지금 생각하는 시나리오는 먼저 srop 를 통해 read 를 콜하고 이를 이용해서 bss 같은 영역에 /bin/sh 를 새겨넣고

콜한 read 를 이용해 eax를 다시 세팅해 execve 를 콜하는거지만


read콜 후 eip 를 어떻게 조정해야하는지 모르겠다. RTL 처럼 하는것도 아닐테고 이부분은 더 해봐야할듯

'Analysis' 카테고리의 다른 글

Pwntools 기본적인 사용법 - 2  (0) 2017.10.11
PPR 없이 ROP  (0) 2017.09.28
Pwntools 기본적인 사용법 - 1  (1) 2017.09.22
Off By One  (3) 2017.08.24
2차원 배열 분석  (0) 2017.08.19