표튜터와 함께하는 Pwnable
-
PIC란표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 17. 17:47
PIC (Postion Independet Code)란? 메모리의 어느 공간에든 위치할 수 있고 수정없이 실행가능한 위치 독립코드를 의미한다.이 코드를 사용하는 각 프로세스들은 이 코드를 서로 다른 주소에서 실행할 수 있고 실행 시 재배치가 필요하지 않다.즉, 공유 라이브러리 내의 심볼들이 어느 위치에 있더라도 동작하게 해준다. 보통 공유라이브러리를 만들때 -fPIC옵션을 이용해서 코드를 컴파일하며보통 GNU/리눅스의 공유라이브러리를 만들 때 각각의 .C파일을 PIC가 가능하도록 컴파일한다. 예제를 통해 PIC가 있고 없고의 차이를 알아보겠다. 아래와 같은 소스코드가 있다. 하나는 non_PIC로 하나는 PIC로 컴파일 했다. readelf의 -d 옵션으로 생성한 공유라이브러리들의 dy..
-
정적라이브러리와 동적라이브러리로 컴파일하기표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 17. 14:20
정적라이브러리와 동적라이브러리를 각각 이용한 컴파일 방법이다. Statically link와 Dynamically link의 차이는 이전의 글에서 언급했으니 참고하기 바란다.https://xn--vj5b11biyw.kr/123 정적라이브러리를 만드는 방법은 ar명령어를 이용하면 되는데ar 명령어를 이용하면 여러 프로그램에서 사용되는 함수를 포함한 오브젝트파일들을하나의 아카이브 파일( .a )로 모아놓을 수 있다. 그렇다면 한번 ar 프로그램을 이용해서 라이브러리파일 (.a)를 만들어보겠다.우선 함수를 정의한 코드를 구현한다. gcc를 이용해서 mylib.c의 오브젝트 코드를 생성한다. 그 다음으로는 위에서 만든 라이브러리 함수를 호출할 프로그램을 만든다. 정적..
-
Mitigation의 종류표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 15. 07:25
MitigationASLR : Address Space Layout Randomization 메모리상의 공격을 어렵게 하기위해 스택, 힙, 라이브러리 등의 주소를 랜덤으로 프로세스 주소 공간에 배치하여 실행할 때마다 데이터의 주소가 바뀌게 하는 기법을 의미함 /proc : process의 줄임말로 이 디렉터리에 프로세스의 정보들이 저장됨 /proc/self : 현재 실행되고 있는 프로세스의 정보가 담겨있는 디렉토리 /proc/self/maps : 현재 실행되고 있는 프로세스의 주소맵 ASLR 해제 명령어 : echo 0 > /proc/sys/kernel/randomize_va_space randomize_va_space = 0 : ASLR 해제 randomize_va_space = 1 : 랜덤 스택 & ..
-
GDB 사용 시 set 명령어표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 15. 04:37
gdb 사용시 set 명령어를 이용하면 자신이 원하는데로 setting을 해서 진행해볼 수 있다.예를 들어 아래와 같은 소스코드가 있다.해당 코드를 컴파일 한 뒤 gdb를 열고 got overwrite를 진행해보도록 하겠다. 컴파일 후 gdb를 이용하여 어셈블리어 코드로 보았다.printf@plt 호출 부분을 들여다보았다. 위에서도 볼 수 있듯, 현재 printf의 함수 호출 주소이다. 이 PLT(Procdure Linkage Table)는 다른라이브러리에 있는 프로시저를 호출해서 사용하는데 그 때 참조하는 것이 바로 GOT(Global Offset Table)이다.got에는 프로시저들의 주소가 들어있다.우리는 이 plt가 참조하는 프로시저들의 주소를 변조시키는 작업을 할 것이다. printf 함수호출이..
-
PLT 와 GOT표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 14. 15:10
PLT와 GOT에 대해서 알아보도록 하겠다!! 이해하기전에 어떤식으로 프로그램이 컴파일되고 실행되는지를 알아야한다.C언어 코드를 예로 들어보겠다.1234567#include int main(){ printf("Hello My name is Ho ~ "); return 0;} 다음과 같은 소스코드가 있다면 이 소스 코드를 실행하기 위해서는 다음과 같은 과정이 필요하다. 우리가 만약에 printf라는 코드를 실행하기 위해서는 우선 코드를 작성하고 컴파일을 해주어야한다. 컴파일을 진행하면 obj파일이 생성되는데 생성된 obj파일은 스스로 실행을 할 수 없다. 그 이유는 소스코드 내부의 함수(printf)가 어떤식으로 구현되어있는지 obj파일은 알 수 없기 때문이다. 이러한 obj파일을 실행하게 하기위해서는 함..
-
[Plaid CTF] Ropasaurusrex Write-up표튜터와 함께하는 Pwnable/CTF Write-up 2019. 2. 12. 06:55
잘못된점이나 이상한게 있다면 댓글부탁드립니다. 제일 처음에 써서 그런지 이전에 썼던 ropasaurusrex Write-up이 수정할 것도 많고 두서가 없어서 다시 써보았다.32bit 바이너리에서 ROP를 이용하여 풀이하는 기본적인 문제이다. 우선 프로그램에 어떤 mtigation이 걸려있는지를 확인해보았다.ELF 32bit 파일이었으며 Dynamically linked를 사용하고 있었다.또한 NX mitigation이 걸려있었기 때문에 메모리의 실행권한은 없어져 있었다.또한 stripped로 symbol이 지워져있음을 알게되었다. 우선 프로그램을 실행해서 어떤 프로그램인지 확인해보았다.문자열을 입력받고 나면 "WIN"이라는 문자열이 출력되는 프로그램이었다.그러므로 입력을 받는 부분을 이용하여 공격을 할..
-
[Codegate2018] BaskinRobins31 Write-up표튜터와 함께하는 Pwnable/CTF Write-up 2019. 2. 11. 02:33
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. 오늘은 처음으로 64bit 바이너리인 BaskinRobins를 풀어보았다!!생각보다 어렵지는 않았다. (Py0zz1가 잘가르쳐준 덕분^^) Payload를 구성하는 것은 순탄하게 진행하였지만Python을 이용하여 코드를 직접짜는 것에서 조금 버벅댔다ㅎㅎ(그래도 파이썬과 점점 친해지고 있는 듯 하다) 이 문제는 우리가 아는 보통의 술자리(?)에서 했던 게임 BaskinRobins31와 같았다.직접 게임을 해보았지만 패배했다...;; 여기서 알 수 있었던 것은 1~3의 숫자를 입력해야하고문자를 입력하게되면Don't break the rules...:(라는 문자열을 보여준다는 것이다. 또한 알 수 있는 것은처음 숫자를 고르면 컴퓨터가 숫자를 고르는 방식..
-
[LOB] Orge -> Troll Write-up표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019. 2. 10. 01:49
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. 이번 문제를 풀면서 생각보다 많은 시간이 들었다. argv[0]를 사용해야한다는 것은 알았는데 "\x2f" 가 복병이었고심볼릭 링크를 이용해야한다는 것도 복병이었다...허허.. 지금부터 풀이를 시작해보겠다.추가된 코드들을 확인해보자 우선 인자는 argv[0], argv[1] 두 개를 사용할 수 있으며argv[0]는 기본적으로 파일명이다. 하나 더 추가된 코드를 보면 argv[1]를 그 길이만큼 0으로 memset해주고 있다.이전 풀이처럼 argv[2]는 우선 사용할 수가 없다. 그렇다면 우리는 쉘코드를 어디에 넣어야할까??argv[1]은 초기화되며 길이도 제한이 있기 때문에 더이상 쉘코드를 넣을 수가 없다 그렇기 때문에 떠올린 것이바로 argv[0..