Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- vmware 반응 속도
- pwn
- GEF
- z3 signed 이슈
- tool
- Seccomp bypass
- python
- 공유 라이브러리는 왜 항상 같은 순서로 맵핑 될까?
- 개발
- Python3
- 지훈현서
- 실시간로깅
- 임베디드 시스템 해킹
- wsl2 복구
- c++
- Python.h: No such file or directory
- vhdx 파일 복구
- Recoverit
- std::cerr
- Windows 부팅 오류
- DYNAMIC Section
- python3.11 설치
- GDB
- VSCode C++ 표준 버전 수정
- python3.11 pip
- 리커버릿
- OpenAI 개발
- docker
- pip 에러 해결
- pwntools
Archives
- Today
- Total
OZ1NG의 뽀나블(Pwnable)
[PWN] Pwntools ssh접속 후 특정 바이너리 실행 및 argv 입력 본문
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]);
}
}
- 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()
위와 같이 원격으로 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()
'Laboratory' 카테고리의 다른 글
[Network] FTP 정리 (0) | 2021.04.12 |
---|---|
[CVE] CVE-2020-8284 : trusting FTP PASV responses 정리 (0) | 2021.02.20 |
[Lab] glibc 2.23 malloc.c 분석 (아직 쓰는 중) (0) | 2020.08.15 |
[Lab] [미완] open함수와 openat함수에서 int flags의 바이너리 상의 값 (0) | 2020.01.24 |
[Lab] int dfd(or dirdf)에 대한 것. (openat, execveat, ...) (0) | 2020.01.24 |
Comments