gdb의 기본적인 명령어 입니다.


 순번

명령어 

설명 

1 

gdb 파일명 

해당 파일을 gdb로 열기 

2 

list = ("l")

gcc 컴파일 시 -ggdb 옵션을 지정한 경우 소스 확인 가능 

3 

disas 주소/함수 

해당 함수를 디스어셈블해 실행 

4 

run = (r)

해당 파일을 실행 

5 

continue = ("c")

브레이크가 걸린 상태에서 계속 실행 

6 

break 주소/함수명 

주소나 함수에 브레이크 포인트를 걸기 

7 

x/32x 주소

주소에서 32개를 16진수로 출력(x/32s는 문자열) 

8  

info registers = ("i r")

레지스터의 값을 출력 

9 

nexti = ("n i")

함수 내부로 들어가면서 한 라인 실행 

10 

stepi = ("s i")

함수 내부로 들어가면서 한 라인 실행 

11 

help 

도움말 출력 

12 

backtrace 

프로그램 실행의 스택 추적 결과 출력 

13 

quit

종료


*7번 자세히..

- x/"범위""출력형식""범위의단위" "메모리주소 또는 함수명"

- 출력형식 : x (16진수), s (문자열), I (명령어)

- 범위의단위 : b (1byte), h(2byte), w(4byte), g(8byte)

 

*실행예제

ex) x/20wx $esp : esp가 가리키는 메모리부터 높은 주소쪽으로 4byte 씩 20개 출력

pwnable.kr의 두번째 문제입니다.


계정의 홈 폴더에는 역시나 첫번째 문제와 같이 세 개의 파일이 존재합니다. 


소스코드를 살표보면 char형 포인터를 인자로 받는 함수가 있습니다. 이 함수(check_password)는 char형 포인터를 int형 포인터로 Type Casting 합니다.

그리고 char형은 1byte, int형은 4byte의 크기를 가지므로 for 문에서는 들어온 char형 사이즈를 4byte로 5번씩 나누어 res변수에 더해집니다.


main 함수에선 인자를 1개 받도록 하였고, 인자의 사이즈가 20byte여야 합니다. 그리고 hashcode와 check_password된 argv[1]의 값이 같게 되면 collision2의 권한으로 /bin/cat 명령을 수행할 수 있습니다.

0x21DD09EC / 5 = 0x6C5CEC8

0x21DD09EC % 5 = 4


0x21DD09EC = 0x6C5CEC8*4 + 0x6C5CECC

이므로 인자로 6C5CEC8을 4번, (6C5CEC8+4)를 1번 입력해주면 hashcode와 같게 됩니다.

Intel CPU의 바이트 오더링은 Little Endian 방식이므로 2바이트씩 뒤집어서 입력해줘야 합니다.


ex) 0x6C5CEC8 - > \xC8\xCE\xC5\x06


이제 인자로 이 값을 넣어주겠습니다. 저는 스크립트 언어인 python을 이용하였습니다.

collision2 쉘을 획득하여서 /bin/cat 명령을 성공적으로 수행했습니다.

'Wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] mistake 1p  (0) 2016.08.19
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29
[pwnable.kr] passcode 10p  (0) 2016.07.29
[pwanble.kr 1번] fd 1pt  (0) 2016.07.27

file 디스크립터에 대한 문제인듯 합니다.


문제 계정 홈에는 총 세가지의 파일이 있습니다.

실행 파일 fd, 소스파일 fd.c 그리고 flag 파일이 있습니다.

fd 파일을통해 fd2의 쉘을 획득하여 flag 파일을 읽으면 문제를 해결할 수 있을듯 합니다.


atoi 함수에 관한 설명입니다.

설명

10진 정수 문자열을 정수로 변환합니다.

      1. 문자열에서 10진 정수 숫자 문자 뒤의 일반 문자는 취소되며, 10진 정수 숫자 문자까지만 숫자로 변환됩니다. 
      2. 10진 정수 숫자 문자 앞의 공백문자는 자동 제거되어 10진 정수 숫자 문자까지만 숫자로 변환됩니다. 
      3. 공백 및 10진 정수 문자가 아닌 문자로 시작하면 0을 반환합니다.

read 함수에 대한 설명입니다.

설명

open() 함수로 열기를 한 파일의 내용을 읽기를 합니다. 

헤더unistd.h
형태ssize_t read (int fd, void *buf, size_t nbytes)
인수int fd파일 디스크립터 
 void *buf파일을 읽어 들일 버퍼 
 size_t nbytes퍼버의 크기 
반환ssize_t정상적으로 실행되었다면 읽어들인 바이트 수를, 실패했다면 -1을 반환


문제에서 fd값이 0이되면 값을 임의로 입력할 수 있습니다. 

따라서 int fd = atoi(argv[1]) - 0x1234 에서 fd에 0이 들어가도록 하면 됩니다.

argv[1]에 0x1234의 10진 정수문자열 값인 4660을 인자로 주면 atoi 함수가 정수로 변환 해주니 fd는 0으로 초기화 됩니다.


입력을 기다리고 있습니다.

strcmp 함수가 0이 되도록 하려면 LETMEWIN을 입력합니다.


fd2의 권한으로 flag 파일을 /bin/cat 명령으로 읽었습니다.


'Wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] mistake 1p  (0) 2016.08.19
[pwnable.kr] uaf 8p  (0) 2016.08.15
[pnwable.kr] random 1pt  (0) 2016.07.29
[pwnable.kr] passcode 10p  (0) 2016.07.29
[pwnable.kr 2번] collision 3pt  (0) 2016.07.27

+ Recent posts