전체 글 156

[pwnable.kr] passcode ( write - up )

처음써보는 pwnable.kr 라이트업 :) [1] 코드분석코드를 분석해보자. 일단 이 코드는 최대 100바이트까지의 이름을 입력받고, int형 패스워드 1,2를 입력받는다.그 후 패스워드1과 2를 비교하여, 조건에 맞으면 /bin/cat flag로 플래그를 보여준다.그래서 일단 맘편하게 바로 패스워드를 입력해보았는데 오류가 뜨는것을 볼수있다.띠용! 왜일까?일단 구글링해보니 fflush함수는 리눅스내에서 제 기능을 하지 못한다고 한다. 그래서 오류가 났을 상황에서는 passcode1 = 1234 / passcode2 = \n 이 들어있을 것이다.그래서 우리는 일단 passcode2는 이용할수없고, 이름을 입력받는 name과 passcode1만을 이용해서 플래그를 찾아야한다.너무 막막하다.. 1234567..

카테고리 없음 2019.04.07

[pwn] PLT, GOT 이해하기

[1] PLT & GOT PLT = Procedure Linkage TablePLT로 말그대로 프로시져 ( 여러가지의 함수들? & 외부 라이브러리? ) 들을 연결한 테이블이라고 이해하면 된다.우리가 함수를 호출할때, 함수는 바로 호출되지않고 PLT를 통해 GOT를 참조하고, GOT에서 함수의 실제주소에 접근하여 함수가 실행된다.GOT = Global Offset Table프로시져의 실제 주소를 가지고있다. PLT가 참조하는 테이블이다.그림으로 보자. printf함수를 실행한다고 했을때, 일단 PLT로 간다. 여기서 두가지의 경우로 나누어지는데 첫번째경우는 printf함수가 첫번째로 실행되었을 경우이다.이때는 PLT > GOT > PLT > _dl_runtime_resolve > printf 호출 ㄴ이과정..

[Reversing] 메모리구조 - Stack / Heap ( 스택프레임 / 함수 프롤로그, 에필로그 / 힙 개념정리 )

ETC카테고리에 있던 포스팅이였는데 그냥 reversing쪽으로 옮긴다. 리버싱 요소이기도 하다고 생각한다. [1] 메모리 구조 - Stack위 그림은 메모리의 구조를 이해하는데 많은 도움이 된다. 우리는 이중에서 Stack 에 대해서 자세히 알아보도록 할것이다.일단 스택은 LIFO ( Last in First out - 후입선출 ) 구조로 되어있다. 이는 스택이 자라나서 커널부분을 건드리지못하게 하려는 의도로 알고있다. =====스택=====높은 메모리주소 --RET----SFP--:

Reversing/ETC 2019.04.06

[x86] 주요 어셈블리 명령어의 종류와 레지스터 ,( EBP, ESP, EIP, EAX ... )와 SFP

[1] 어셈블리어 ( Assembly ) 는 무엇일까? & 배우는 목적?어셈블리어는 기계어와 함께 유일한 저급 언어 ( Low level ) 언어이다.기계어에 1대1 대응이 되는언어이며, 기계어 바로 전 단계의 언어이다.여기서 저급 언어란, 컴퓨터와 더 가까운 언어라고 생각하면 되고, C언어도 포인터를 통하여 메모리에 접근하기때문에 저급언어적 특징을 가지고잇는 고급 ( High level ) 언어라고 생각하면 된다.여기서 여러분들은 컴퓨터와 더 가까운 언어인 어셈블리어를 왜 배워야할까? 라고 생각할수도있다.물론 나도그랬다.그런데 시스템해킹이라던가, 리버스엔지니어링, 임베이드 프로그래밍 등등 여러가지 분야에서 어셈블리가 필수적이였다는것을 알게되었다.시스템해킹을 공부하다보니 간단한수준의 어셈블리 명령어와 레..

Reversing/Assembly 2019.04.06

[C] 포인터 보고서

[1] 포인터는 뭘까? 먼저 주소값이란 뭘까?데이터의 주소값이란 해당 데이터가 저장된 메모리의 시작 주소를 의미한다.C언어에서는 이러한 주소값을 1바이트 크기의 메모리 공간으로 나누어 표현한다. 예를 들어, int형 데이터는 4바이트의 크기를 가지지만, char형 데이터의 주소값은 시작 주소 1바이트만을 가리킨다.이를 이해하였으면 다음의 예제를 보자.다음의 예제를 보자.12345678910111213141516#include int main(){ int a; printf(" 변수 a를 입력하세요 : "); scanf("%d",&a); // a 입력 int *pa=&a; // pa라는 포인터변수에 a의 시작주소 저장 // * 는 역참조 연산자로 해당 메모리주소에 있는 값을 말한다. // & 는 참조 연산자..

Layer 7/assignment 2019.04.03

[C] 함수 보고서

[1] 함수는 뭐고, 이러한 함수를 왜 활용하는것일까 ? 우리가 코딩할때 무의식적으로 쓰는 #include 가 무슨의미일까?그리고 printf, scanf같이 명령어같은 친구들은 도대체 뭘까?여러분들은 이미 그 답을 알고있을 것이다.위의 그림은 stdio.h에 포함되어있는 함수의 목록이다. 이렇게 printf, scanf는 바로 함수이다. 함수는 수학적인 함수와 비슷한 의미이다. 사용자가 정의한대로 그 기능이 실행된다.#include 는 이러한 함수를 모아서 하나의 헤더파일로 만든 stdio.h 를 소스에 포함하여 프로그램을 실행할때 stdio 에 있는 함수를 사용할수있도록 해주는것이다.위에서 함수의 정의에 대하여 설명하였으므로 이제 함수를 사용하는 이유와 함수의 특징을 설명해보겠다.첫번째 특징은 함수의..

Layer 7/assignment 2019.04.03