orge
문제 분석
troll 소스코드를보면 arguement가 2개로 고정되어있고,
환경변수 초기화,buffer 값 초기화, argv[1]가 초기화가 됬다.
30.
orge
풀이 제시
troll 파일에쉘코드 이름으로 된 심볼릭 링크를 걸어놓아서 프로그램을 실행할
때 그 위치로 리턴값을 변경하면 쉘을 얻을 수 있다!
shellcode
troll
buffer [ebp - 44]
A(40자)
ebp
AAAA
return value
new return value
program name
argv[0]
argc
vampire
풀이 제시
orge 때와마찬가지로
skeleton 파일에 쉘코드 이름으로 된 심볼릭 링크를 걸어놓아서 프로그램을 실행할
때 그 위치로 리턴값을 변경하면 쉘을 얻을 수 있다!
shellcode
skeleton
buffer [ebp - 44]
A(40자)
ebp
AAAA
return value
new return value
program name
argv[0]
argc
skeleton
풀이 제시
LD_PRELOAD 변수에쉘코드를 삽입하면 원하는 쉘을 획득 할 수 있을 것이다.
buffer [ebp - 44]
A(40자)
ebp
AAAA
return value
new return value
LD_PRELOAD=
shellcode
argc
nop(0x90) ....
nop(0x90) ....
nop(0x90) ....
nop(0x90) ....
shell code start
golem
풀이 제시
프로그램 함수는leave 와 ret 으로 종료가 되는데
leave는 mov esp ebp / pop ebp 이고 ret는 pop eip 이다.
problem_child의
stack
buffer[40]
ebp
[main ebp pointer]
return value
call problem_child
이후 주소
main 의 stack
ebp
[old esp pointer]
return value
return code
실행
leave
ret
leave
ret
58.
golem
풀이 제시
ebp의 값을조작할 수 있으면 함수가 leave ret으로 끝날 때
원하는 주소의 코드를 실행할 수 있다!
problem_child의
stack
buffer[40]
ebp
[FAKE ebp pointer]
return value
call problem_child
이후 주소
main 의 stack
fake ebp
[JUNK pointer]
조작된
return address
조작된
return address의
code 실행
leave
ret
leave
ret
59.
golem
풀이 제시
ebp의 마지막비트를 이용해 esp-4 값을 저장시켜 shellcode를 실행하게 해보자!
problem_child의
stack
shellcode의 주소
(4 byte)
x90*36
ebp
[problem_child의
esp-4 값]
return value
call problem_child
이후 주소
main 의 stack
problem_child
의 esp-4 값
shellcode의
주소 값
shell code 실행
leave
ret
leave
ret
darkknight
풀이 제시
프로그램이 로드될때 필요한 외부 함수의 주소값을 불러오게 되는데
이 주소값을 리턴 주소값으로 하여 원하는 함수를 호출 할 수 있다.
이걸 return to libc 라고 한다.
buffer [ebp - 44]
A(40자)
ebp
AAAA
return value
new return value
system()
AAAA
address of
'/bin/bash'
system("/bin/bash") 실행
bugbear
풀이 제시
풀이 방법은다음 과 같다.
buffer [ebp - 44]
A(40자)
ebp
AAAA
return value
new return value
execve()
BBBB
address of
'/bin/bash'
address of
address of 'bash'
address of
'null'
/bin/bash의 주소값은 환경 변수가 초기화가 안됫으므로
환경변수를 가리키는 주소값을 사용하면 될것같다.
문제는 바로 이것인데 심볼릭 링크를 이용하여
환경변수 안에 있는 bash를 가리키는 주소값을 넣는다
이 역시 마찬가지로 환경변수의 null을 가리키는 주소값
아무거나 넣으면 된다.
giant
풀이 제시
메인 함수의ret을 두번 호출하면 다음과 같은 결과가 나온다
main의
stack
buffer[40]
ebp
[main ebp pointer]
return value
ret의 주소값
main 의 stack
return value
ret 의 주소값
return value
shell code
....
shell code
실행
ret
ret
assassin
풀이 분석
golem 에서썼던 방식을 응용하여 프로그램을 실행해보았다.
main의
stack
buffer[40]
ebp
[FAKE ebp pointer]
return address
leave
ret 주소값
main 의 stack
fake ebp
[JUNK pointer]
조작된
return address
조작된
return address의
code 실행
leave
ret
leave
ret
assassin
풀이 분석
그럼 다음과같은 공격 설계가 가능하다.
main 의 stack
buffer[40]
ebp
[FAKE ebp 를 가리키
는 주소]
return address
main 의
leave ret
main 의 stack
FAKE EBP
shellcode 주소
shell code 실행
leave
ret
leave
ret
zombie_assassin
풀이 결과
main 의stack
buffer[40]
ebp
[FAKE ebp 를 가리키
는 주소]
DO's address
GYE
GUL
YUT
MO
JUNK
'/bin/bash's 의
address
'/bin/bash'
main 의
stack
FAKE EBP
GYE
system() 실행
after
ret
main 의
stack
FAKE EBP
GUL
main 의
stack
FAKE EBP
YUT
main 의
stack
FAKE EBP
MO
그럼 다음과 같은 공격 설계가 가능하다.
succubus
문제 분석
strcpy 함수를호출할때 매개변수 는 이렇게 들어간다
지금 ebp+4 값(return 주소값)이 41414141로 채워저있는 것을 확인 했다.
old ebp값
리턴 주소값
(0x41414141)
목적지 주소값
[ebp+8]
출발지 주소 값
[ebp+0xc]
98.
succubus
풀이 과정
리턴주소값은 main함수중에 덮어 쓰므로 출발지 주소값에 shellcode의 주소값을
쓰고 목적지 주소값을 리턴 주소값을 가리키는 주소값(ebp+4)에 덮어쓰면 된다!
old ebp값
리턴 주소값
(0x41414141)
목적지 주소값
[ebp+8]
[ebp+0x4]
출발지 주소 값
[ebp+0xc]
99.
succubus
풀이 결과
쉘코드는 환경변수에올려놓고 출발지 주소를 그 주소값으로 하고
목적지 주소값은 덤프파일로 주소값을 추출했더니,
nightmare의 쉘을 획득할 수 있었다!
xavius
문제 분석
클라이언트에서 서비스를요청하면 Death Knight가 무얼 말하고서
입력값 256자(recv(256))를 받게 한다 --> 그걸 받는 buffer값은 길이가 40이다.
107.
xavius
풀이 제시
attacker
"A" *40
임의의 스택 주소 값
(reverse shell code
주소값)
reverse shell code
server
"A" * 40
임의의 스택 주소 값
(reverse shell code
주소값)
reverse shell code
reverse shell 실행
reverses shell을 위한
포트 개방
공격코드
전송
shell 획득
공격 구성도는 다음과 같다
108.
xavius
풀이 제시
쉘코드는 shellstorm에서 구할 수 있었고, 공격 코드를 작성하였다.
우분투를 사용했고 공격 서버는 lob 서버의 주소이다.
http://shell-storm.org/shellcode/files/shellcode-833.php