GDB를 사용하거나 사용하지 않고 환경 변수의 주소 찾기

GDB를 사용하거나 사용하지 않고 환경 변수의 주소 찾기

환경 변수 내부에 쉘코드가 포함된 쉘을 생성하는 익스플로잇을 만들려고 하고 있으며 클린 환경 실행기나 GDB를 사용하고 있으므로 변수가 맨 위에 있습니다.

env -i MYVAR=10 gdb ./prog

문제는 GDB 내부에 COLUMNS 및 LINES라는 변수가 있고 다음을 사용하여 삭제한다는 것입니다.

unset env COLUMNS
unset env LINES

그런 다음 환경을 인쇄합니다.

x/20s *((char **)environ)

이러한 변수가 표시되고 동일한 주소를 갖는 출력을 계속 생성합니다. 나는 그것을 사용하여 삭제했다는 것을 알고 있습니다.

show env COLUMNS

변수가 정의되지 않았다는 오류를 생성합니다.

삭제된 환경을 표시하지 않고 새로 업데이트된 환경을 표시하는 방법은 무엇입니까?

내 목표는 GDB 외부에서 MYVAR의 주소를 찾는 것이지만 프로그램을 조작할 수 없기 때문에 설정된 변수를 사용하지 않고 GDB 내부의 환경을 복사하면 주소를 얻을 수 있다.

고마워요, 조쉬

답변1

환경은 execve()프로세스가 명령을 실행할 때 세 번째 "envp" 인수로 시스템 호출에 전달되는 두 번째 문자열 배열이며, 첫 번째 인수는 인수("argv")입니다.

규칙에 따라 이러한 문자열은 다음 형식을 따릅니다 var=value.

execve("/path/to/cmd", ["cmd", "arg1", "arg2"], ["var1=value1", "var2=value2"])

일반적으로 다른 명령이 실행될 때(일반적으로 해당 하위 프로세스에서) 명령은 실행 시 받은 환경 문자열을 실행하는 명령에 전달합니다. execvp()C 라이브러리의 함수는 그 자체로 시스템 호출을 둘러싼 래퍼이며 execve()기본적으로 이를 수행합니다. C 라이브러리(명령이 링크될 수도 있고 링크되지 않을 수도 있지만 일반적으로 링크됨)에서 이 environ변수는 실행 중에 수신된 envp 배열을 기반으로 채워집니다. 이 변수는 execve()// / ... 및 // 배열 업데이트에 의해 후속 s 에서 execvp()envp 로 전달 됩니다 .execlp()system()popen()putenv()setenv()unsetenv()environ

unset env varin 은 gdb이와 동일한 작업을 수행하며(호출할 수도 있음) unsetenv()시작 시 수신된 문자열로 시작하는 문자열은 지금부터 실행되는 명령에 전달되는 배열에 포함되지 않음을 의미합니다.var=gdbenvpgdb

명령이 실행되면 libc do 를 사용하여 변수를 채우는 것(예: 연관 배열 또는 셸과 같은 셸 envp)을 포함하여 수신된 배열(스택의 맨 아래에 있음)을 사용하여 원하는 모든 작업을 수행 할 수 있습니다. libc do 프로그램을 사용하는 앱. 대부분의 환경 변수에 대한 쉘 변수 이름과 호환되는 이름으로 쉘 변수를 생성합니다.environperl%ENV

관련 정보