Description
Category: Misc/Coding
Source: pwnable.kr
Points: 40
Description:
Mom? how can I pass my input to a computer program?
Write-up
input 문제는 특별한 보안 취약점을 묻는 문제가 아니다.
소스 코드를 보면, 바이너리에 다양한 방법으로 입력을 주는 방법에 대한 지식을 묻고 있는 것을 알 수 있다.
총 다섯개의 stage를 돌파하면 flag 값을 주게 되어 있는데, exploit을 C로 구현할 경우 좀 더 쉬워지는 stage도 있지만 앞으로 문제를 풀어나가려면 python에 익숙해지는 과정이 필요하니 조금 어렵더라도 python을 이용해서 문제를 풀어보기를 추천한다.
취약점 내용이 아닌 관계로, 각 stage를 일일이 설명하지 않고 문제 해결을 위한 코드를 첨부한다.
import subprocess
import os, sys, struct
import socket, time
#stage 1
cmd = ["/home/input2/input"];
for i in range(99):
cmd = cmd + ["A"];
cmd[65] = "";
cmd[66] = "\x20\x0a\x0d";
cmd[67] = "25009";
#stage 2: creat pipe
(r0, w0) = os.pipe();
(r2, w2) = os.pipe();
#stage 3
my_env = os.environ.copy();
my_env["\xde\xad\xbe\xef"] = "\xca\xfe\xba\xbe";
#stage 4
f = open("\x0a", "w");
f.write("\x00\x00\x00\x00");
f.close();
#launch command
p = subprocess.Popen(cmd, stdin=r0, stderr=r2, env=my_env);
#stage 2: send message by pipe
os.write(w0, buffer("\x00\x0a\x00\xff"));
os.close(r0);
os.close(w0);
os.write(w2, buffer("\x00\x0a\x02\xff"));
os.close(r2);
os.close(w2);
#stage 5
time.sleep(1); #give time to perpare server socket
host="127.0.0.1";
port=25009;
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
try:
s.connect((host, port));
s.send(buffer("\xde\xad\xbe\xef"));
s.close();
except Exception as e:
print('Connection failed to server ' + host);
time.sleep(1);
p.poll();
/tmp 디렉토리에 적당한 디렉토리를 생성하여 위 코드를 넣고, flag에 symbolic link를 건 뒤 실행하면 flag를 얻을 수 있다.
Flag : Mommy! I learned how to pass various input in Linux :)
'writeups > Coding|misc.' 카테고리의 다른 글
SQL (0) | 2019.11.25 |
---|---|
plz variable (0) | 2019.11.25 |
algo-auth (0) | 2019.11.25 |
PWN (0) | 2019.11.23 |
Run me! (0) | 2019.11.23 |