짱짱해커가 되고 싶은 나

[fd] writeup 본문

pwnable/pwnable.kr

[fd] writeup

동로시 2020. 1. 1. 23:39

ssh : secure shell protocol. 컴퓨터와 컴퓨터가 public network를 통해 서로 통신을 할 때 보안적으로(공개키 시스템) 안전하게 통신을 하기 위해 사용하는 프로토콜.

ex) 데이터 전송, 원격 제어에 사용

 

fd파일에 s permission이 있는 것을 통해 fd가 setuid, setgid의 권한으로 실행됨을 확인할 수 있다.

fd를 실행하면 pass argv[1] a number가 출력되고 종료된다.

fd.c를 보면 argc가 2이상이어야 하는 것을 확인할 수 있다. 

argc는 메인함수에 전달되는 인자의 수 이고 

argv는 메인함수에 전달되는 값이다.

argv[0]은 항상 실행경로가 들어가기 때문에 argc는 기본적으로 1이다.

read(fd, buf, 32)는 fd라는 파일디스크립터로부터 buf의 주소에 32만큼 읽어온다는 뜻이다.

그리고 이 때 buf에 LETMEWIN\n이 들어있을 경우 flag를 얻을 수 있다.

즉, 우리는 buf에 LETMEWIN\n을 넣어야 하는데 이를 위해서는 파일디스크립터의 값을 표준입력으로 바꿀 필요가 있다.

 

표준입력은 0으로 우리는 fd의 값을 0으로 만들면 된다. fd는 argv[1]에서 0x1234를 뺀 값이므로

argv[1]에 0x1234인 4660을 넣으면 된다.

 

fd에 인자로 4660(0x1234) 전달. argv[1]의 값은 4660. atoi(argv[1]) - 0x1234 = 0 임으로 fd의 값은 0.

read(0, buf, 32)가 실행되기 때문에 LETMEWIN\n을 buf에 입력 가능하게 된 것이다.

 

+) PHP strcmp 취약점

PHP : 서버에서 실행되는 프로그래밍 언어

배열을 인자로 넣을 경우 반환 값은 0이 된다.

PHP 5.2에서는 1또는 -1을 반환,

PHP 5.3 이상 버전에서는 NULL을 반환하는데 그럴 경우 NULL == 0 꼴이 된다.

==으로 느슨한 비교를 했을 때는 이를 true, ===으로 엄격한 비교를 했을 때는 false를 반환한다.

따라서 PHP 5.3에서 배열을 인자로 strcmp를 사용할 경우에는 ===을 사용해서 우회를 막자~

 

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

[random] Writeup  (0) 2020.05.21
[passcode] Writeup  (0) 2020.05.21
[flag] Writeup  (0) 2020.05.21
[bof] Writeup  (0) 2020.05.20
[Collision] Writeup  (0) 2020.05.20
Comments