29. 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
42. vampire
풀이 제시
orge 때와 마찬가지로
skeleton 파일에 쉘코드 이름으로 된 심볼릭 링크를 걸어놓아서 프로그램을 실행할
때 그 위치로 리턴값을 변경하면 쉘을 얻을 수 있다!
shellcode
skeleton
buffer [ebp - 44]
A(40자)
ebp
AAAA
return value
new return value
program name
argv[0]
argc
57. 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
66. 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") 실행
74. 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을 가리키는 주소값
아무거나 넣으면 된다.
78. 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
83. 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
86. assassin
풀이 분석
그럼 다음과 같은 공격 설계가 가능하다.
main 의 stack
buffer[40]
ebp
[FAKE ebp 를 가리키
는 주소]
return address
main 의
leave ret
main 의 stack
FAKE EBP
shellcode 주소
shell code 실행
leave
ret
leave
ret
93. 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
그럼 다음과 같은 공격 설계가 가능하다.
97. 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의 쉘을 획득할 수 있었다!
106. 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
풀이 제시
쉘코드는 shell storm에서 구할 수 있었고, 공격 코드를 작성하였다.
우분투를 사용했고 공격 서버는 lob 서버의 주소이다.
http://shell-storm.org/shellcode/files/shellcode-833.php