PWN1

0. 시스템 해킹의 시작

ctf(capture the flag)

 

ctfcapture the flag의 약자로 해킹대회를 일컫는 말이다. ctf대회에서 우리는 대회 사이트에 올라와 있는 문제를 풀어 flag(정답)를 얻어내고 이를 통해 우열을 가리는 대회이다. 혹시 이 문서를 읽기 전에 ctf가 어떻게 진행되는지 자세하게 알고 싶다면, HackCTFpwnable.kr 등의 워게임 사이트에 접속해 보자. 대부분은 해킹의 분야에 따라 문제들이 나열되어 있으며 문제를 클릭하면 pwnable의 경우에는 주소와 바이너리 파일, 그리고 flag를 인증할 수 있는 입력창이 보일 것이다. 우리는 이 바이너리를 다운 분석한 후 서버에 있는 문제를 해킹하여 관리자 권한을 따낸 후 flag를 얻어 인증하면 된다. 이런 워게임 사이트 외에 실제로 대회에 참가하고 싶다면 ctf.time.org라는 사이트를 참고하자 현재 진행되고 있는 대회나, 앞으로 진행될 대회 등 많은 정보가 있다.

 

 

Xshell

 

워게임 사이트나 ctf문제의 대부분은 sshnc등을 통해 서버에 접속해서 문제를 풀게 된다. 여기서 ssh란 네트워크상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 등을 일컫는 말이다. 즉 다른 컴퓨터에 원격으로 명령을 내릴 수 있다는 말이다. 그렇다면 한번 xshell을 통해 다용도로 사용할 서버에 접속해 보자.

xshell을 실행시키면 이런 화면이 뜬다. 우선 왼쪽 위 끝에 보이는 파일을 클릭해보도록 하자 그러면 맨 위쪽에 새로 만들기를 클릭한다 새로 만들기를 클릭하면 아래와 같은 화면이 뜰 것이다

이름은 일단 pwnable로 해주고, 프로토콜은 SSH로 해주겠다. 호스트 자리에는 서버의 주소가 들어가야 하는데 xxxxx.kro.kr처럼 본인이 접속하고 싶은 서버의 주소를 입력하면 된다. 주소를 정확하게 입력했다면 확인을 눌러주면 된다.

정상적으로 잘 따라 했다면 파일->열기에 pwnable이 있는지 확인하자

이런 식의 화면이 뜨면 성공이다. 

하지만 앞으로 계속 사용할 서버에 접속하는 것이 아니라 그저 ctf문제를 풀기 위해 ssh접속을 해야 하는 상황이라면 이렇게 번거롭게 할 필요가 없다. 그 이유는 이렇게 새로 만들기를 하는 이유는 단축키 몇 개로 지정해 놓은 주소로 바로 연결할 수 있기 때문이다.

예를 들어 pwnable.krfd문제는 ssh를 통해 접속하는 방식인데 우리는 ctf 문제처럼 앞으로는 사용하지 않을 주소를 굳이 저장할 필요가 없다. 그렇다면 xshell을 처음 실행시킨 화면으로 돌아가 보자

사실 이 방법은 매우 간단한데 [C:\~]$뒤에 ssh [서버 주소]를 타이핑하고 엔터만 누르면 바로 접속된다.

하지만 우리가 자주 접속할 서버 같은 경우에는 주소를 저장해 놓는 편이 편하다

 

 

GDB 

gdb는 다양한 유닉스 기반의 시스템에서 동작하는 디버거이다.

gdb의 사용법은 ”gdb (옵션 ex: -q) 파일 이름 이다.

 

--------------------------gdb의 옵션------------------------

 

-q : gdb가 실행될 때 출력되는 안내문을 없애준다.

-c : core 파일을 디스어셈블 할 때 사용한다.

core 파일이란 프로그램이 예기치 못한 일로 종료되었을 때 나오는 유언장 같은 파일이다. gdb를 통해 core 파일을 분석하여 어떤 이유 때문에 이름만 보고서는 우리가 이 프로그램이 왜 어떤 이유로 종료되었는지 알기 힘들어서 우리는 gdb를 통해 이 core 파일을 분석하는 것이다.

 

이번에는 실제로 ctf에서 출제된 pwnable분야 문제를 gdb를 통해 분석해보며 gdb에서 자주 쓰이는 명령어들을 알아보겠다.

 

이 문제의 이름은 bbof이다. 따라서 bbof란 바이너리를 디스어셈블하기 위해서는 ”gdb bbof”를 입력하면 된다.

 

성공적으로 gdb가 잘 실행된 모습이다. 혹시 이렇게 길게 나오는 안내문이 불편하다면 배운 것처럼 q 옵션을 사용하면 안내문이 사라지는 마술을 경험할 수 있다.

 

disas [함수명]- 지정한 함수의 어셈블리어 코드를 출력한다.

info [func] 함수들을 모두 출력한다.

info reg [레지스터]를 통해서 레지스터도 볼 수 있다.

info reg가 길면 각 단어의 앞글자만 따서 명령어를 실행할 수도 있다.

즉, i r [레지스터]와 같은 의미이다.

 

main 함수를 확인할 수 있다.

또한, 메인 함수 이외에도 system, puts, frets들의 친숙한 함수의 모습도 볼 수 있다.

 

r 프로그램을 실행시킨다

말 그대로 프로그램을 실행시킨다. 위의 프로그램을 보면 사용자에게 입력을 받고 입력값과 주소를 출력해주는 프로그램인 것 같은데 그냥 r이란 명령어를 사용하면 프로그램이 실행된다는 점 정도만 알아두도록 하자. (./bbof한 것과 비슷하다.)

b(breakpoint) * [함수명] + [위치] - 지정한 위치에 breakpoint를 건다.

c breakpoint를 넘어 계속 실행한다(다음 breakpoint를 만날 때까지)

p [함수명 or 변수명] - 지정한 함수의 주소나 변수를 출력한다.

q or ctrl + d gdb를 종료한다

댓글

댓글 본문