GOT overwrite 간단하게 연습 해보려고 합니다 


환경은 SENTOS 6.7이며 보호기법은 다 걸려있는상태입니다

(보호기법은 필요없지만요!)


scanf , printf 어느쪽이든 상관없습니다 .


둘의 plt주소를 발견 한 후에 system함수로 뒤바꿔버리고 

"%s" 대신에 "./a;" 가 실행되게 하여 

root 권한이 걸린 파일을 실행시켜보겠습니다 


먼저 scanf 혹은 printf의 plt 주소를 찾아보겠습니다 



readelf -S 명령어를 통해 plt의 주소를 찾았습니다 . 


그 뒤 gdb를 열어서 plt의 주소들을 봐보니 


pintf 와 scanf 둘 다 보이는걸 확인할 수 있습니다 


그중에서도 printf로 진행해보겠습니다



먼저 system 주소를 구했습니다 


이제 %s의 주소를 구해야겠지요 ? 



0x8048514를 이동시켜주네요 



확인해봤더니 %s가 존재합니다 


이 %s를 어떻게 a로 돌려서 공격하냐 ? 

16진수로 주소값이 써주는상태고 SET으로 변경만 하면 되니까 



./a; 를 만들어 줘야하니 . = 0x2e   / = 0x2f   a = 0x61  ; = 0x3b    

리틀 엔디언으로 ./a; 는 0x3b612f2e 가 되겠습니다 


그렇다면 이제 print plt에 system 주소를 주고 
%s에 ./a;를 줘보겠습니다 



이런식으로 실행이 되네요! 재밌습니다 

'시스템' 카테고리의 다른 글

Loaded plugins : fastestmirror 에러  (0) 2016.06.01
cent os gdb 설치  (0) 2016.05.29
Cent os 에서 xshell , putty 연동  (0) 2016.05.29
cent os 컴파일러(gcc) 다운  (0) 2016.05.28
함수 호출 규약(Calling Convention)  (0) 2016.05.27

/etc/sysconfig/network-scripts/ifcfg-etho0 을 열어서 DNS1 = 168.126.63.1을 추가했습니다!

그 뒤에 /etc/resolve.conf 를 열어서 namseserver에 DNS1의 주소를 넣어줬습니다.


168.126.63.1 이란 ? 



다 저장하신후에 service network restart 를 해서 적용을 시킨뒤

yum update 라던가 하던 작업을 진행해보시면 

정삭적으로 진행이 되는것을 볼 수 있습니다!

'시스템' 카테고리의 다른 글

GOT overwrite 예제 1  (0) 2016.06.06
cent os gdb 설치  (0) 2016.05.29
Cent os 에서 xshell , putty 연동  (0) 2016.05.29
cent os 컴파일러(gcc) 다운  (0) 2016.05.28
함수 호출 규약(Calling Convention)  (0) 2016.05.27

yum install gdb

'시스템' 카테고리의 다른 글

GOT overwrite 예제 1  (0) 2016.06.06
Loaded plugins : fastestmirror 에러  (0) 2016.06.01
Cent os 에서 xshell , putty 연동  (0) 2016.05.29
cent os 컴파일러(gcc) 다운  (0) 2016.05.28
함수 호출 규약(Calling Convention)  (0) 2016.05.27

ifconfig 명령어로 확인을 해보면

eth0이 존재하지 않거나 eth0 의 inet addr:127.0.0.1로 나오는등 설정이 되어있지 않은 경우들이 있습니다 .

그렇다면 network 설정을 해줘야 합니다 .

다른 블로그 가보면 포트설정도 하고 이것저것 하는데..

제가 전부 다 시도를 해봤습니다만 먼저 이거 한번 해보세요!

Vmware 메뉴에서 Edit > Virtual Network Editor 항목에 들어가보면 저러한식으로 

vMnet이 있는데 그 중에 vMnet8 Subnet Address (맨 오른쪽)부분에 192.168.127.0

부분이 있습니다 그 중에서 127 즉 3번째 부분의 숫자들을 잘 기억해주세요 

그 후에 vi /etc/sysconfig/network-scripts/ifcfg-eth0 명령어를 입력해줍니다!

바이 편집기로 보시게 되면 저러한식으로 친구들이 잇지요 ? 

다른것들 저 따라하셔도 좋지만 그 중에서 

IPADDR , GATEWAY , NETWORK 부문의 세번째 숫자를 아까 vMnet8 Subnet Address 부분의 3번째 숫자로 넣어줍니다!

그 뒤에 내용을 적용하기 위해서 service network restart 명령어를 사용해줍니다 

그리고 나서 /sbin/ifconfig 명령어를 입력해서 나오는 inet addr의 주소와 port를 입력해주고 실행해주면 됩니다! 

'시스템' 카테고리의 다른 글

Loaded plugins : fastestmirror 에러  (0) 2016.06.01
cent os gdb 설치  (0) 2016.05.29
cent os 컴파일러(gcc) 다운  (0) 2016.05.28
함수 호출 규약(Calling Convention)  (0) 2016.05.27
스택 프레임  (0) 2016.05.27

(* 해당 cent os의 버전은 6.7입니다 다른 버전들도 모두 활용 가능합니다)


cent os (레드햇 리눅스) 에서는 gcc가 기본으로 제공되지 않습니다!

혹시 모르니 gcc -v 명령어를 통해서 깔려있나 확인을 해봅시다! 
제 cent os 에는 깔려있지 않습니다

그렇다면 이제 gcc를 다운 받아 볼까요 

 

yum 명령어를 사용해야합니다! yum 이란 ?

Yellowdog Updater Modified의 약자이고 rpm 기반의 자동 업데이터 , 패키지 설치 / 삭제 도구 입니다!
그냥 설치도구라고 생각하시면 되겠습니다 ㅎㅎㅎ
저 명령어를 치면,,

이러한 식으로 용량과 함께 설치할거냐 안할거냐 묻네요 설치합시다!

gcc는 c와 c++을 나눠서 받아야 하더군요 

아까 과정과 마찬가지로 이번엔 c++을 다운 받읍시다!

y를 눌러주시고 , ,

gcc가 정상적으로 깔려서 young1.c 파일을 컴파일해서 사용하는모습입니다! 


'시스템' 카테고리의 다른 글

cent os gdb 설치  (0) 2016.05.29
Cent os 에서 xshell , putty 연동  (0) 2016.05.29
함수 호출 규약(Calling Convention)  (0) 2016.05.27
스택 프레임  (0) 2016.05.27
쉘과 쉘코드  (0) 2016.05.22

함수 호출 규약 = 함수를 호출 할 때 파라미터를 어떤 식으로 전달하는가? 에 대한 일종의 약속이다 
(*파라미터란 ? int myung(int a, int b); 이러한식으로 잇을때 int는 리턴형 myung은 함수명이고 괄호안의 int a , int b 가 파라미터(함수 인자) 이다

cdecl , stdcall, fastcall, thiscall 이렇게 4가지 방식이 존재한다 


1.cdecl

주로 C언어에서 사용하고 C언어와 C++프로그램에서 피러미터 전달시 디폴트로 사용오른쪽에서 왼쪽 방향으로 스택에 저장.
파라미터 해제는 프로시저를 호출한 것이 책임진다
caller에서 스택을 정리한다 .
cdecl에 비해서 코드 크기가 작아진다 
가변 길이 파라미터를 전달할 수 있다.


2.stdcall

Win32 API 프로시저 에서 사용한다(GUI) 
(* 프로시저 = 어떤 행동을 수행하기 위한 일련의 작업 순서)
Callee에서 스택을 정리


[*Callee란 ? 
1. 주로 EBX,ESI,EDI에 쓰인다.
2.Caller가 마음대로 사용할 수 있는 레지스터이다.
3.Callee는 이들 레지스터를 사용하기 전에 반드시 백업한 후 사용 해야 하고 이전 함수로 복귀하기 전에 값을 복구해 주어야 합니다. ] 

파라미터 전달은 cdecl과 동일하다 .
c언어에서 stdcall 방식을 사용하고 싶을 때는 함수이름 앞에 '_stdcall'옵션을 추가한다.
파라미터 해제는 프로시저 복귀 전에 이루어져야 한다 .

장점 : 빠른 함수 호출이 가능하다 , 함수 독립성이 뛰어나다 
복귀된 후에 호출한 프로시저에 대하여 신경쓸 필요가 없다
cdecl 방식의 함수 호출 규약에 비해 코드 크기가 줄어든다


3.Fastcall

첫 파라미터 2개를(ECX,EDX)를 이용해 전달한다 나머지는 스택을 통해 오른쪽에서 왼쪽으로 저장한다 .
스택 제거는 stdcall과 동일하다 

장점 : 더 빠른 함수 호출이 가능하다 

단점 : ECX , EDX 레지스터 백업이 필요하거나 함수에서 ECX , EDX를 다른 용도로 써야 할 경우 파라미터를 따로 저장해야한다


아주 간단하게 정리 

cdecl 부모 쪽에서 스택 복구

stdcall 자식 쪽에서 스택 복구

fastcall 레지스터를 통해 인자 전달



'시스템' 카테고리의 다른 글

Cent os 에서 xshell , putty 연동  (0) 2016.05.29
cent os 컴파일러(gcc) 다운  (0) 2016.05.28
스택 프레임  (0) 2016.05.27
쉘과 쉘코드  (0) 2016.05.22
/bin/sh의 의미  (0) 2016.05.22

스택 프레임 

어떠한 함수가 호출되었을 때 그 함수가 가지는 공간 구조이다.

ex ) void main() {

printf("화이팅");

}

어셈블리로 순서를 나타내면

프로그램 시작 
main() push
printf() push
printf() pop
main() pop
프로그램 종료

main 함수에서 printf 함수를 호출하네요 
메모리 상에서 main함수로부터 어딘가에 존재하는 printf 함수를 찾아가야 하고 
printf 함수가 종료되면 printf함수가 호출되었던 위치인 main 함수로 다시 돌아가야 합니다 

위에 있는 main함수는 function 함수의 위치를 파악 할 수 있습니다.
function 함수의 위치는 컴파일 할 당시에 지정이 되기 때문이죠.

허나 function 함수는 자신이 돌아갈 (main 함수) 위치를 알 수 없습니다 .

고로 main함수에서 function 함수를 호출하기 직전에 현재 위치를 스택 영역에 저장을 해야합니다 . function 함수가 끝나면 스택 영역에 저장된 main함수로의 복귀 주소를 알아내어 다시 돌아올 수 있기 때문입니다 .

*ebp는 베이스 포인터라고 불리웁니다. 이는 스택 프레임이 시작된 위치의 주소값을 가리킵니다 

여기서 잠시 일반적인 프로그램의 스택의 시작을 봐보도록 하겠습니다!

push ebp
mov  ebp , esp

이 친구들의 뜻이 뭘까요 ? 바로 스택 프레임의 생성입니다.
함수가 실행이 될 때 그 이전의 ebp(sfp)를 스택에 push하고 현재의 esp를 ebp에 저장해라 (새로운 ebp) 생성 이라는 뜻입니다

만약 
void function(){
123
}
void main()
{
  function()
}

이러한 프로그램이 있다고 칩시다!
function() 부분의 스택을 보게된다면 맨 처음에
Push ebp 
Mov ebp, esp 를 하고 있을겁니다 .
여기서 Push ebp가 실행이 되면 그 이전 스택 프레임(main)의 ebp가 
function의 스택 프레임에 push가 됩니다 . 

즉 main의 주소가 function의 esp 에 들어가게 됩니다!
이제 두번째 명령인 Mov ebp ,esp를 실행함으로써 
function 의 ebp로 만들어주게 됩니다 
고로 function의 ebp에는 main의 ebp가 존재하게 됩니다

*또한 새로운 function 스택 프레임의 ebp를 기준으로 
ret는 ebp-4 매개인자는 ebp-8과 같이 들어가게 됩니다

고로! esp는 현재 데이터의 위치 이고 ebp는 돌아와야할 주소 값!(main) 이란 겁니다!

'시스템' 카테고리의 다른 글

cent os 컴파일러(gcc) 다운  (0) 2016.05.28
함수 호출 규약(Calling Convention)  (0) 2016.05.27
쉘과 쉘코드  (0) 2016.05.22
/bin/sh의 의미  (0) 2016.05.22
dummy 크기 정확히 파악하기 - 출처 http://beist.org  (0) 2016.05.01

'시스템' 카테고리의 다른 글

함수 호출 규약(Calling Convention)  (0) 2016.05.27
스택 프레임  (0) 2016.05.27
/bin/sh의 의미  (0) 2016.05.22
dummy 크기 정확히 파악하기 - 출처 http://beist.org  (0) 2016.05.01
코어덤프  (0) 2016.05.01

sh는 bone shell이라고도 하며 가장 기본적인 쉘이다.

쉘이란 커널과 사용자를 연결해주는 하나의 매개체 역할을 한다고 보면 된다.

쉘은 여러가지 형태로 만들어지지만 크게 csh 계열과 ksh 계열로 나뉜다.

csh는 c 언어를 기초로 관리자 중심으로 만들어진 쉘이고

ksh는 korn shell이라고 불리며 사용자 중심으로 만들어진 쉘이다.

csh는 후에 tcsh으로 확장된다.

리눅스는 bash라는 쉘을 사용하며 이 의미는 born again shell의 의미를 가지고 있다.

bash는 csh의 관리적인 측면과 ksh의 사용자 편의성 측면을 모두 고려하여 만들어진 쉘이다.

리눅스는 대부분의 쉘을 호환하여 사용할 수 있다.


/bin/sh는 쉘의 절대 경로 이다

'시스템' 카테고리의 다른 글

스택 프레임  (0) 2016.05.27
쉘과 쉘코드  (0) 2016.05.22
dummy 크기 정확히 파악하기 - 출처 http://beist.org  (0) 2016.05.01
코어덤프  (0) 2016.05.01
리눅스 gdb 명령어 (계속 추가)  (0) 2016.02.28

http://www.hackerschool.org/HS_Boards/data/Lib_system/dummy3.txt

더미 크기를 파악하는 방법에 관하여 자세히 나와있습니다.

저도 lob를 다 푼 후 3번정도 다시 읽어봐야겠습니다 

'시스템' 카테고리의 다른 글

쉘과 쉘코드  (0) 2016.05.22
/bin/sh의 의미  (0) 2016.05.22
코어덤프  (0) 2016.05.01
리눅스 gdb 명령어 (계속 추가)  (0) 2016.02.28
공유메모리  (0) 2016.02.18

+ Recent posts