리버싱 24

Layer7 리버싱 5차시 과제(1) - prob5 풀이

목차 1. prob5 분석 및 코드 복원 1. prob5 분석 및 코드 복원 일단 main 함수를 뜯어보자, 처음에 read를 호출하는 장면을 볼 수 있다. read함수는 생소할 수 있으니 설명을 해보겠다. read는 말그대로 입력을 받아오는 함수인데, 맨 앞에 파일 디스크립터를 줄 수 있어 사용자 입력, 파일 등 여러 곳에서 입력을 받을 수 있다. 여기서는 0x0(standard input)으로 주는 것으로 보아 사용자로부터 입력을 받는 것 같다. 두 번째 인자로는 버퍼 주소를 줄 수 있는데, [rbp-0xd0]을 주는 장면에서 버퍼 위치가 [rbp-0xd0]이라는 사실을 알 수 있다. 세 번째 인자로는 입력받을 사이즈를 지정해줄 수 있다. 0xc8을 인자로 주는 것으로 보아 사용자로부터 0xc8보다 ..

reversing 2022.08.01

Layer7 리버싱 4차시 과제(2) - prob2 풀이

목차 1. prob2 분석 및 페이로드 제출 1. prob2 분석 및 페이로드 제출 분석을 시작해보자. 일단 처음에 아까도 봤던 함수 프롤로그(스택 프레임 생성)이 보인다. rsp에서 0x20을 뺐으므로 지역변수 크기는 대략 32바이트 정도 될 것이다. 아까 prob1을 분석할 때도 봤던 스택 카나리가 또 나왔다. 스택 카나리를 사용하므로 아마 main함수의 맨 아래쪽에는 스택 카나리값이 ebp-0x8에 잘 들어있는지 확인하는 코드가 있을 것이다. 존재한다. 그럼 이 두 부분을 제외하면 아마 모두 사용자가 직접 작성한 코드가 될 것이다. 분석을 시작하려했는데, main이 시작하자마자 srand@plt라는 함수를 호출한다. srand는 rand함수를 사용하기 전 랜덤값을 만들어낼 시드를 정해주는 함수이다...

reversing 2022.07.27

layer7 리버싱 4차시 과제(1) - prob1 풀이

목차 1. prob1 정적 분석 2. prob1 동적 분석 1. prob1 정적 분석 prob1을 gdb로 열고, disass 명령어를 통해 main함수를 출력해보았다. 이걸 하나씩 해석해보자. 일단 main+0부터 main+4까지는 저저번 시간에 배운 스택 프레임을 형성하는 코드이다. rbp(스택의 바닥을 가리킴)를 스택에 push하고 rsp(스택의 천장을 가리킴)값을 rbp값으로 옮겨 함수가 끝났을 때를 대비해 현재 스택의 바닥을 임시로 저장하고, 새로운 스택프레임의 바닥을 가리키게 된다. 그 다음 rsp에서 0x10, 즉, 16을 빼주었고, 이것은 main함수의 지역변수를 담기 위한 공간이다. main+8에서는 fs라는 공간에서 값을 가져오는데, 이는 스택 카나리라고 하는 보호기법 때문에 사용한다...

reversing 2022.07.27

Layer7 리버싱 3차시 과제

1. 어셈블리어 2. 레지스터 3. 메모리 구조 1. 어셈블리어 우리가 짜는 C언어 코드, 자바스크립트 코드 등 하이레벨 언어들은 각 컴파일러마다 다르게 해석해 각기 다른 기계어가 만들어진다. 따라서 기계어만을 가지고 원래 코드대로 복구하는 것은 각 컴파일러마다의 해석 방식을 알아야 하고, 서로 다른 코드가 겹치는 경우도 있기 때문에 굉장히 어려운 일이다. (물론 아이다 등의 디컴파일러가 있지만, 완벽하진 않다.) 이렇게만 보면 리버싱이 가능한 건가라는 생각이 들지만, 우리에겐 기계어가 있다. 이 기계어만 보면 코드 해석이 사실상 불가능하지만, 기계어와 1대1로 대응되는 어셈블리어를 보면 사람도 어느정도 해석이 가능하다. 이런 이유 때문에 우리는 어셈블리어를 볼 줄 알아야 리버싱을 제대로 할 수 있다. ..

reversing 2022.07.25