본문 바로가기

해킹

해킹에 대한 생각

나는 고등학교 때 처음 코딩과 해킹을 접했다.

그 전까지는 그저 코딩은 1도 모르고 컴퓨터도 몰랐으며 그저 게임만 좋아하던 학생이었다.

 

교등학교를 들어가며 처음 코딩을 비롯해 다양한 정보를 얻을 수 있었는데, 그 중에서 가장 나의 이상을 깨뜨렸던 것은 해킹이었다.

지금도 나는 해킹을 모른다. 나보다 훨씬 잘하는 사람이 많고 심지어 나는 해킹을 잘 하는 편도 아니다. 그래서 아마 이 글을 해킹을 전문적으로 한 누군가가 본다면 '어디 해킹 맛만 봐놓고 생생만 내네 ㅉㅉ' 라고 생각할지도 모른다.

하지만 이것은 그저 나의 생각이었으니까. 내가 경험했던 것들이 있었으니까. 내가 경험했던 모든 것들이 거짓이고 잘못된 것이었을지라도 일단 생각은 적어보고 싶다.

만약 이게 정확한 생각이라면 더더욱 좋을것이다.

 

일단 크게 내가 배웠던 해킹은 3가지라고 말할 수 있다. (물론 잘 했던 것은 아니다.)

1. 시스템 해킹

2. 웹 해킹

3. 리버싱 (Reverse Engineering)

그래서 세상에는 IoT를 사용한 해킹도 존재하고 네트워크 패킷을 가로채는 등 훨씬 다양한 해킹 기법들이 존재하지만 일단 내가 배웠던 분야에 한해서만 정리해보겠다.


1. 시스템 해킹

물론, 다른 해킹 기법들도 원리는 비슷하지만, 시스템 해킹은 정해진 프로그램을 원하지 않는 방식으로 조작하는 것을 의미한다.

예를 들어, Buffer Overflow를 생각해보자.

버퍼(Buffer)는 컴퓨터 메모리의 한 종류이다. 버퍼 외에도 스택(Stack), 힙(Heap) 등 여러 메모리 구조가 있습니다.

이것을 사람의 몸으로 비유하자면, 버퍼는 위장과 비슷하다고 할 수 있다. 사람에게 적당한 양의 음식(데이터)을 제공하면 무리 없이 소화할 수 있겠지만, 위의 용량보다 훨씬 많은 양을 준다면 더 이상 먹지 못할 것이다.

하지만 컴퓨터는 사람과 달리 넘치는 데이터까지 모두 수용하려고 하는데, 그러면 마치 위가 한계 이상으로 팽창하여 다른 장기, 예를 들어 심장을 누르게 되는 상황처럼, 컴퓨터에서는 버퍼의 한계를 넘어선 데이터가 다른 메모리 영역을 침범해 오류를 일으킬 수 있다.

 

2. 웹 해킹

웹 해킹도 세부 분야가 너무 많다. DB와 관련된 Sql Injection부터 시작해서 서버에서 날아오는 패킷을 위조해 의도치 않은 데이터를 뽑는 해킹 기법도 존재한다.

 

Sql Injection을 예시로 들어보자.

서버에서 사용자가 입력한 데이터를 검사하는 조건을 걸었다고 생각해보자.

코드는 아래와 같다.

if(ID == "Admin" && password == "1234"){
	print("Welcome Admin!")
}

아래 코드는 해석하자면 다음과 같다.

입력한 ID가 admin이고 비밀번호가 1234라면 Welcome Admin!을 출력하는 것이다. 뭐 실제 웹페이라고 생각한다면 Admin 전용 페이지로 이동한다고 생각하면 될 것이다.

 

그래서 Sql Injection이라는 것은 사용자가 입력할 수 있는 저 ID부분과 password부분을 코드상의 허점을 이용하는 것이다.

위 코드에서 ID는 Admin이라고 입력하고, password는 우리가 알 수 없다고 했을 때 지금 코드를 검사하는 부분이 조건문이기 때문에 이를 password를 입력하는 부분에서 수정할 수 있다.

 

그러면 ID는 Admin으로 입력하고 password 부분에서 코드의 허점을 이용해서 입력을 짜보면 아래와 같다.

password == 1" == "1" || "1

위와 같이 입력하면 아래와 같이 코드가 구성될 것이다.

if("Admin" == "Admin" && "1" == "1" || "1" == "1234"){
	print("Welcome Admin!)"
}

 비밀번호를 확인하는 부분에서 "1" == "1"을 확인했을 때 통과가 되었고 "1"과 "1234"를 확인할 때는 통과가 안됐지만 || 을 사용해서 둘 중 하나만 통과하게 한다는 조건을 넣었기 때문에 결과적으로는 사용자가 Admin의 password를 몰라도 Admin의 계정으로 접속할 수 있는것이다.

 

3. 리버싱

리버싱은 어려운 해킹 기법중 하나라고 생각한다.

컴퓨터는 기본적으로 0과 1로 데이터를 저장한다고 한번씩 들어본적이 있을 것이다.

프로그래머가 짠 코드도 예외란 없다.

 

리버싱이라는 기법 자체는 프로그램을 다시 뜯어서 코드 구조를 분석한 후 내부 구조를 변형시켜 기능을 따라하거나 특정 기능을 망가뜨리기 위해 사용된다. 대표적인 예시로 Crack이 있다. 돈을 내고 사용해야하는 프로그램이 있을 때 해커가 해당 프로그램을 구매하거나 다른 경로를 통해 가져와서 사용자가 직접 구매하였는지 확인하는 부분을 무력화시켜 다시 배포시킨것이 바로 '크랙'이다.

 

그러면 코드를 어떻게 뜯을 수 있을까?

메모장으로 프로그램의 코드를 다시 볼수 있는 것은 확실히 아니다.

그러면 프로그래밍을 작성하는 코드 에디터로 볼 수 있을까? 그것도 아니다.

 

프로그램을 뜯을 수 있는 기능이 존재하는 프로그램이 따로 존재한다.

대표적으로 IDA가 있으며, Ollydbg, x64dbg 등이 있다.

 

위 이미지는 IDA라는 프로그램을 사용하면 볼수 있는 화면이다.

복잡하다. 

 

간단하게 얘기하자면 위의 복잡한 '어셈블리 코드'라는 것을 재해석하여

if(buy == TRUE)

와 같은 코드를 지워서 다시 저장하는 것이다.

음.. 직관적이진 않지만 아마 이렇게 생각하면 편할것이다.

 

if( buy == True){
	print("Welcome to the program!")
else{
	print("you have to buy this program!)
}

여기에서 buy를 검사하지 않도록 조건문을 삭제하는 것이다.


위 글은 비전공자들이 해킹을 이해하기 쉽도록 최대한 풀어쓴 글이다.

 

물론 이해가 가지 않을수도 있다.

하지만 이 글을 통해 해킹에 대한 막연한 어려움이나 환상이 풀렸으면 좋겠다.