netis.cgi


void *memcpy( void *dest, const void *src, size_t count );
memcpy(v15, pMib + 17730 * v12 + 18112 + 12, sizeof(v15));
memcpy(pMib + 15213 + 17730 * v12, pMibDef + 15213 + 17730 * v12, 2955);
memcpy(pMib + 17730 * v12 + 18112 + 12, v15, 9);
pMib + (17730 * v12) + (18112 + 12) 에서 v15의 사이즈만큼 v15에 저장
pMib+15213에 2955만큼 저장
pMib+17730에 9만큼 저장
int sprintf(char *buffer, const char *format-string, argument-list);
sprintf(a3, "/web/%s", v6);
sscanf

#include <stdio.h>
int sscanf(const char *buffer, const char *format, argument-list);
buffer에서 argument-list가 제공하는 위치로 데이터를 읽습니다.
각 argument는 format-string에 서 유형 지정자에 대응하는 유형의 변수에 대한 포인터여야 합니다.
v4: buffer 포인터
format: string
v7, v5 주소, v6 주소, v8 주소
sscanf로 인한 버퍼 오버플로우:
v7에 크기 제한 없이 문자열을 읽는 %s 사용으로, 입력 데이터가 32 바이트를 초과할 경우 오버플로우가 발생합니다
근데 그 밑에 a1이랑 v7이랑 다르면 strcpy()


v5, v6, v8은 단일 char로 선언되었기 때문에, 각각 1바이트의 메모리만 차지
%s는 문자열을 저장하려고 하므로, 저장하려는 데이터가 1바이트를 초과하면 다른 메모리 영역을 덮어쓸 수 있음
MIPS
sub_404B80
인자가 5개

mips
addiu : (Add Immediate Unsigned)
sw: (Store Word)
li: (Load Immediate)
jal: (Jump and Link)
sp: 스택 포인터
fp: 프레임 포인터
ra: 함수 반환주소
얘는 하드웨어 정보를 받아와서
v14 = v13;
v8 = (const char *)inet_ntoa(v13);
sprintf((int)a4, "%s", v8);
이런식으로 a2, a3, a4 에 할당을 한다.
$a0 : br0
$a1 : $fp+0x20
$a2 : $fp+0x30
$a3 : $fp+0x40
스택+0x10 = $fp+0x50
inet_ntoa 결과를 저장하는데 이게 이진값인 ipv4주소를 192.168.0.1 이렇게 점-소수점 표기법으로 변환해주는거라 제일 커도 16바이트이고, 각각 크기도 16바이트임
sprintf 탈락! strcpy도
sscanf에서 입력받는 바이트 수가 안 정해진 부분을 보면~? /proc/net/route 파일 내용들을 파싱하는 부분이었다...
sub_404810
인자가 2개
proc/net/arp 파싱
sub_40494C
인자가 2개