OZ1NG의 뽀나블(Pwnable)

[PWN] Pwntools ssh접속 후 특정 바이너리 실행 및 argv 입력 본문

Laboratory

[PWN] Pwntools ssh접속 후 특정 바이너리 실행 및 argv 입력

OZ1NG 2020. 2. 23. 17:14

pwnable.kr을 풀려다가 pwntools을 사용하지 않고는 내 지식선에선 풀기 힘든 문제가 있어 삽질하다 알아냈다. :)

 

 

[*] ssh 접속

from pwn import *

p1 = ssh("계정명", "서버주소", port=포트, password="비밀번호")

다들 pwntools을 쓴다면 위와 같이 ssh로 서버에 접속이 가능하단 것을 알거임.

 

[*] 접속 후 특정 바이너리 실행

from pwn import *

p1 = ssh("계정명", "서버주소", port=포트, password="비밀번호")
p = p1.process("실행할 바이너리 절대경로")

그리고 이어서 위와 같이 우리가 로컬에서 익스할때 자주 쓰던 process로 특정 바이너리를 실행 가능함.

 

[*] 특정 바이너리에 argv 넣어주기

from pwn import *

p1 = ssh("계정명", "서버주소", port=포트, password="비밀번호")

argv1 = ["" for i in range(argc)]
argv1[1] = "AAAA"
argv2[2] = "BBBB"
p = p1.process(executable="실행할 바이너리 절대경로", argv=argv1)

근데 접속 후 특정 바이너리를 실행 하고 만약 해당 바이너리에 argv까지 줘야 한다면?

위와 같이 해주면됨.

process로 argv를 넣어줄 때 argv는 리스트형으로 들어가면 알아서 각 원소가 하나의 인자로 들어가게 됨. (개꿀)

 

그리고 이 리스트로 넣는거의 장점은 쓸모 있을지는 모르겠지만 argv[0]도 바꿀 수 있음.

(정상적이라면 argv[0]에는 해당 바이너리를 실행할때 맨앞에 넣어주는 바이너리 실행 명령어?경로?가 들어가야 함.)

 

[*] TEST

아래는 직접 테스트해본거임.

- argv 테스트 대상 코드

#include <stdio.h>

void main(int argc, char * argv[]){

        printf("[*]argc : %d\n", argc);

        printf("[*]argv : ");
        for(int i=0;i<argc;i++){
                printf("argv %d : %s\n", i, argv[i]);
        }

}

[사진1]-argv 테스트 대상 코드 실행 결과

 

- argv 테스트 원격 실행 코드

이번엔 실제로 원격 접속으로 test를 실행해봄.

from pwn import *

p1 = ssh("계정명", "서버주소", port=포트, password="비밀번호")

argv1=["" for i in range(5)]
argv1[0] = "0000" 	# <-- argv[0] 변경
argv1[1] = "aaaa"
argv1[2] = "bbbb"
argv1[3] = "cccc"
argv1[4] = "dddd"

p = p1.process(executable ="/home/user/ctf/pwnable.kr/test", argv=argv1)

print p.recv()

[사진2]-argv 테스트 원격 실행 코드 실행 결과

위와 같이 원격으로 argv값이 잘 들어간 상태로 바이너리가 실행되었고 추가로 argv[0]도 변경된게 보임.

 

 

끗. :)

 

 

[+] 추가 (23.03.15)

업데이트 된건지는 모르겠지만 다음과 같은 방식으로도 argv 값을 추가할 수 있다.

from pwn import *

argv = []
payload = b''
payload += b'\xff'*0x24
payload += p64(addr)
argv.append(payload)
print(argv)

p = process(["./binary"] + argv) # <-- 이렇게 리스트에 한번에 넣는 방법

p.interactive()

 

 

 

Comments