실행
입력 잘하면 flag 준단다.
소스 코드 확인
main
크게
1. argv
2. stdio
3. env
4. file
5. network
로 나눌 수 있다.
argv
조건
1. argc가 100
2. argv['A']가 "\x00"
3. argv['B']가 "\x20\x0a\x0d"
ord() : 문자의 아스키코드값 반환하는 함수
이렇게 코드를 작성하고 process함수의 argv인자에 ch를 설정해주면 된다.
stdio
조건
1. 표준입력으로 4byte 읽은 문자열이 "\x00\x0a\x00\xff"
2. 표준에러로 4byte 읽은 문자열이 "\x00\x0a\x02\xff"
표준 에러 : one.txt파일을 a(all)모드로 open, "\x00\x0a\x00\xff"을 write한 후 바로 close하고
process함수의 stderr를 one.txt의 파일 기술자로 설정
표준 입력 : p.sendline함수(표준 입력)로 "\x00\x0a\x00\xff" 전달
env
조건
"\xde\xad\xbe\xef"의 환경변수 값이 "\xca\xfe\xba\xbe"
이건 process함수의 env를 이용
file
조건
1. "\x0a"파일을 r모드로 연다.
2. 그 파일을 4byte읽어서 buf에 넣는다.
3. buf값이 "\x00\x00\x00\x00"
with as 구문을 써서 간단히 "\x0a"파일에 "\x00\x00\x00\x00"을 쓴다.
network
조건
1. socket을 생성한다.
2. bind, linsten한다.(port는 argv['C'])
3. 클라이언트와 accept한 후, recv한 4byte 데이터가 "\xde\xad\xbe\xef"
일단 process함수 자체가 원격 호스트의 로컬에서 실행되는 것
즉, 로컬 호스트에서 tcp나 udp 연결을 만든 후 그 소켓에 "\xde\xad\xbe\xef"를 전송
argv['C']를 아무 값(ex. 5555)으로 설정한 후,
remote 함수를 이용해 로컬 호스트에 5555번 포트로 연결하는 통신 생성,
반환된 오브젝트에 send()로 "\xde\xad\xbe\xef" 전달
* 프로세스 생성 후에 remote함수 이용
remote('연결할 호스트','포트번호')
최종 코드
참고
1. 리눅스에선 모든 입출력과 관련된 장치는 파일과 동일하게 보고 처리한다.
윈도우에서 하드디스크의 경우 C:, D:와 같이 다루어지는 것과 달리,
리눅스는 장치파일이라는 특수한 파일 형태로 다룬다.
프린트, 사운드카드 까지도 파일의 형태로 다른다.
2. sendline으로 프로세스에 데이터를 보내면 표준 입력으로 보내진다.
표준입력은 프로세스가 생성될 때 자동으로 열린다.
3. (python) with as 구문 : 파일을 열고, 사용 후에 닫는 것을 보장토록 하는 코드로 매우 간단
4. ./test aaa = ./test “aaa” = ./test `perl -e ‘print “aaa”’`
= ./test `python -c ‘print “aaa”’` = ./test `echo “aaa”`
5. main의 envp로 시스템 환경 변수에 대한 정보를 받아올 수 있다.
프로세스가 실행되면 시스템으로부터 환경변수 정보를 받아서 이 정보를 바탕으로 실행이 된다.
setenv, putenv 같은 함수들로 조작을 하더라도 해당 프로세스의 환경변수가 변경되는 것일 뿐
실제 시스템의 환경변수가 변화되는 것은 아니다.
6. 무슨 문자열이던지 '\x0'을 끝에 붙여줘서 문자열의 끝을 인식하게 해주자.