PLT (Procedure Linkage Table)


실제 호출 코드를 담고 있는 테이블

 내용 참조를 통해 실제 시스템 라이브러리 호출이 이루어진다.


GOT (Global Offset Table)


GOT는 PLT 가 참조하는 테이블로써 프로시져들의 주소를 가지고 있다. 

PLT가 어떤 함수를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 된다.



간단한 예제를 통해 PLT 와 GOT를 이해해보자.


사용할 소스코드는 다음과 같다



비교적 간단한 소스코드이다.


사용하는 운영체제가 64bit 이므로

32bit로 깔끔하게 컴파일 해주기 위해 -fno-stack-protector -m32 옵션을 주었다.



이 옵션을 주기 위해서는 gcc-multilib가 필요하다.

apt-get install gcc-multilib 명령어를 이용해 설치할 수 있다.


이제 gdb를 이용하여 만들어진 바이너리를 열어보자.



disas main을 해보면 0x80482c0(puts@plt영역에 call하는 것을 볼 수있다.


printf 함수가 내부적으로 puts을 호출하나 보다 -ㅅ-


살펴보자.



PLT 영역을 보면 puts에 대해서 3단계로 구성되어 있는것이 보인다 


그럼 첫 번째 jmp는 당연히 GOT영역이 된다는 것을 알 수 있다.



GOT 부분을 보면 PLT의 두번째 부분을 가리키는 것을 알 수 있다.


이는 첫번째 호출이기 때문이다.



문 득 공부하다보니!


첫번째 호출이 아니라면? 이라는 의문을 가질 수 있었다.


printf 함수를 한번 사용해본 상태에서 break point를 걸고 확인해보자.



printf 가 한번 실행됬다.



0x80496c4 의 값이 바뀐 것을 알 수 있다.



'pwnable > 기타' 카테고리의 다른 글

songsari's prob4  (0) 2016.09.12
songsari's prob3 (RTL)  (0) 2016.09.10
songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
RTL 심화  (0) 2016.08.09

bof


하핳 56바이트 만큼 떨어져 있구나.


하지만 덮어보니 segmentation fault 가 뜨지 않았다.


흠 더미값이 있는것 같다


4바이트 8바이트 12바이트 계속 더해서 세그폴트가 뜨는 곳을 찾아보자.



72byte를 덮어주니 eip가 덮인 것을 확인할 수 있다.


우리는 이 문제를 풀기 위해 bss 영역에 대해서 알 필요가 있다.


bss영역은 한마디로 초기화를 해주지 않은 변수가 들어가는 영역이다.


흠 이제 RTL을 이용하여 우회해보자.


gets를 리턴시키기 위해 bss 를 인자로 받게끔 넣어준다.


그 뒤에 쉘코드를 넣어주면? 쉘이 나올것 같다. 한번 넣어주자.



0x804A020 이 bss 영역의 주소이다


여기서 20은 공백을 의미하므로 30으로 바꿔넣어주자



gets 함수의 주소는 0x080482f0이다


이제 익스플로잇을 해보자.


익스플로잇에 사용할 쉘코드는

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80 이다.




'pwnable > 기타' 카테고리의 다른 글

songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
Format string  (0) 2016.08.09
echo is what?  (0) 2016.08.09
RTL 기법 실습  (0) 2016.07.16

secret



원래 IDA 로 까보면 플래그가 보인다.....


허나 우리는 공부를 해야 하므로 리눅스에서 exploit 을 통해 알아보자


흠 보아하니 포멧스트링 취약점이 있다.


나이쓰 쑤아리 질러


흠 몇번째가 플래그를 출력하는 값일까.


/dev/urandom 을 가져오기 때문에 값은 아마 바뀔거다.



햏 6번째였다....



'pwnable > 기타' 카테고리의 다른 글

songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
RTL 심화  (0) 2016.08.09
echo is what?  (0) 2016.08.09
RTL 기법 실습  (0) 2016.07.16

wantable



IDA로 까보면 내용은 단순한 것 같다.



왓더뻑!$@#$$


쉘 스크립트를 어느정도 알고 있다면 금방 풀 수 있는 문제이다....

'pwnable > 기타' 카테고리의 다른 글

songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
RTL 심화  (0) 2016.08.09
Format string  (0) 2016.08.09
RTL 기법 실습  (0) 2016.07.16

bin-overflow


일단 pwnable 바이너리가 나오면 무조건 IDA 로 살펴보는 습관을 들이자.



main함수의 내용을 IDA 를 통해 C로 출력한 모습이다.


read 함수를 통해 32byte를 입력받을 수 있게 해 놓았다.


[bp-4h] : ebp로 부터 4byte 만큼 떨어져 있다는 뜻이다.


그렇다면 gdb를 통해 확인해 보도록 하자.



r <<< $(python -c 'print"A"*20')


입력함수의 인자에 20byte를 채워보았다. 


나중에는 계산해서 넣어주어야 하지만 지금은 그냥 게싱을 한다 생각하자.


20byte를 채워주니 ebp와 eip 의 값이 모두 바뀐 것을 확인할 수 있었다.


그렇다면 16byte로 다시 채워보자.




ebp는 채워졌으나 eip가 바뀌지 않았다.


그렇다면 20byte를 덮어씌웠을때 eip까지 모두 덮인다는 것을 확인할 수 있다.


다시 IDA로 넘어가서 분석해보자.


system 함수가 있는것으로 보아 RTL 공격이 통할 것 같다.






그렇다면 flag를 출력해주는 문자열이 어딘가에 존재할 것이다. 찾아보자



"/bin/cat flag" 라는 문자열이 존재한다.



자 이제 공격 코드를 삽입해 보자. 


python -c 'print"A"*20 + "\x50\x83\x04\x08" + "AAAA" + "\x90\x85\x04\x08"' 


앞에있는 함수의 주소는 뒤에있는 주소를 인자로 받고 

"AAAA"라는 문자열을 리턴한다.




임의로 만든 flag 인 helloworld가 출력됬음을 확인할 수 있다.



※실습하기 전에 미리 flag 파일을 만들어 놓도록 하자~



'pwnable > 기타' 카테고리의 다른 글

songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
RTL 심화  (0) 2016.08.09
Format string  (0) 2016.08.09
echo is what?  (0) 2016.08.09

+ Recent posts