01.ROP(Return Oriented Programming)-x86
ROP는 기본적으로 RTL 기법을 이용하며, 공격자는 RTL과 Gadgets을 이용해 공격에 필요한 코드를 프로그래밍 하는 것이다.
Stack address | Value | Explanation |
0xffffd57c | System function address of libc | Fuction Return Address |
0xffffd580 | The address to return to after calling the system function | |
0xffffd584 | First argument value |
다음과 같은 방법으로 여러 개의 함수를 연속해서 실행할 수 있다.
Stack Address | Value | Explanation |
0xffffd57c | Read function address of libc | Function Return Address |
0xffffd580 | Address of gadgets(pop;pop;pop;ret) | |
0xffffd584 | First argument value | |
0xffffd588 | Second argument value | |
0xffffd58c | Third argument value | |
0xffffd590 | System function address of libc | |
0xffffd594 | The address of retunr to after calling the system function | |
0xffffd598 | First argument value |
다음과 같이 PLT & GOT 영역의 내용 및 값의 변경을 확인할 수 있다.
read() 함수가 처음으로 호출되기 전에 Break point를 설정하였다.
read함수의 plt, got 영역의 주소는 다음과 같다.
.plt : 0x8048300
.got.plt : 0x804a00c
read@plt 영역에는 libc에서 read() 함수를 호출하기 위한 코드가 저장되어 있다.
read@plt 의 코드는 다음과 같이 동작한다.
read@got(0x804a00c) 영역에 저장된 주소로 이동한다.
read@got(0x804a00c) 영역에는 <read@plt+6>(0x8048306)영역의 주소가 저장되어 있다.
이는 해당 프로그램에서 read() 함수가 한번도 호출되지 않았기 때문이다.
<read@plt+11> 의 "jmp 0x80482f0" 코드에 의해 _dl_runtime_resolve() 함수를 호출한다.
다음과 같이 Overflow를 확인할 수 있다.
Return address(0xffffd37c) - buf 변수의 시작 주소 (0xffffd33e) = 62
Exploit 순서
read 함수를 이용해 "/bin/sh" 명령을 쓰기 가능한 메모리 영역에 저장
read(0,writableArea,len(str(binsh)))
write(1,read_got,len(str(read_got)))
read(0,read_got,len(str(read_got)))
system(writableArea)
확인해야 할 정보 목록
해당 바이너리의 0x0804a000 ~ 0x0804b000 영역에 쓰기권한이 부여되어 있다.
앞에서 확인한 쓰기 가능한 영역에는 .got.plt, .data, .bss 섹션이 포함된다.
rp++를 사용하여 원하는 Gadgets을 찾는다.
다음과 같이 gdb에서 .plt, .got 영역을 확인 할 수 있다.
다음과 같이 system 함수의 Address, offset을 확인할 수 있다.
REF: https://www.lazenca.net/display/TEC/01.ROP%28Return+Oriented+Programming%29-x86
03.ROP(Return Oriented Programming) - mmap, mprotect (0) | 2020.07.07 |
---|---|
02.ROP(Return Oriented Programming)-x64 (0) | 2020.07.01 |
댓글 영역