pwnable.kr第二遍---passcode

>>>>>passcode
1.题目中有两个scanf("%d",addr)的不标准格式
按照scanf()的使用,应该是将stdin的整型数赋值给地址addr处


而接下来的passcode1==338150&&passcode2=13371337两个判断条件
其中passcode1和passcode2是整型


int addr;
假如输入100
则*addr=100
那么addr?


而且如何修改addr值?


2.lea mov
lea(load effective address)
lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax,而不是把ebx+8处的内存地址里的数据赋给eax。
而mov指令则恰恰相反,例如:
mov eax,[ebx+8]则是把内存地址为ebx+8处的数据赋给eax。


在本题中;如果是使用正确的scanf
则应该为:lea -0x70(%ebp),%edx
把ebp-0x70的值放在edx
否则为:mov -0x10(%ebp),%edx
把(ebp-0x10)地址存放的内容放在edx


于是详解scanf():
mov $0x80487dd,%eax //eax里边存放的是用户输入
lea -0x70(%ebp),%edx //edx存放的是一个地址
mov %edx,0x4(%esp) //将一个地址写入给esp+4指向的的位置
mov %eax,(%esp) //将eax中的内容写入esp指向的的位置
首先将$0x80487dd地址处的内容给eax
将-0x70(%ebp)这一地址给edx
然后将edx的内容给esp+4
再将eax的内容给esp


所以scanf("%d",&a)与scanf("%d",a)在第二句中不一样


3.objdump -R passcode
显示文件的动态重定向入口;也就显示了那些动态链接时才加载的函数信息
如printf scanf fflush等
objdump


4.GS保护
检测某些覆盖函数返回地址、异常处理程序地址或特定类型的参数的缓冲区溢出。


5.GOT表&&如何看GOT区域
IDA




6.内存区域可写的部分??????
代码段(.text):存放
数据段(.data)
BSS段


7.mov %eax (%esp)
esp带括号与否?
eax...通用寄存器与Esp ebp之间的区别
ext段在内存中被映射为只读,但.data和.bss是可写的。
堆栈中哪些是可写的?

8.python -c 


9.如何输入??????


10.system()函数的开始是从0x080485e3开始的而不是ea!!


11.fflush和printf都可以;但是scanf()函数的GOT表不可以


思路详解:
main
esp字节对齐?
esp-10;然后将返回地址压栈
调用函数;指令后边是函数入口地址
将。。。给esp??两个之间相差了40


welcome()
push ebp 新的ebp
0x88的距离处,设置栈顶esp
esp            0xffc25a00 0xffc25a00
ebp            0xffc25a88 0xffc25a88
GS保护
eax(函数返回地址入栈) ebp-0xc
清空eax


将要输出的内容地址给esp,借用eax?
然后调用printf函数


将要输出的内容给esp,借用eax...这里不是这个作用了。。。
将要输入的内容给esp+4的位置,借用edx;ebp-0x70
将要输出的内容地址??给esp,借用eax


将之前的ebp-0xc的直至给eax
最后几句不明白??

login()
esp            0xffc25a60 0xffc25a60
ebp            0xffc25a88 0xffc25a88

push ebp 当前esp作为新的ebp
0x28处 设置栈顶Esp


将要输出的内容借用eax给esp,然后调用printf函数


scanf一般都有四条指令,用到esp,ebp,eax,edx
两条用来存储输入的字符串,两条用来定位目的地址
这里将内容输入到ebp-0x10位置处
输入的内容由Eax交给(%esp)

接下来是两条调用??作用 fflush前边的

然后输出字符串,借用eax
接下来又是scanf指令四条
这次将内容存储到ebp-0xc的位置处

接下来是比较指令,如果不想等则跳转
否则调用位于0x8048460的system()函数

由于第一个字符串的scanf()函数中确定只能接收100长度的字符串
因此只能利用第一个初始化passcode1
然后利用第二个scanf函数将passcode1的内容修改即可

这里的思路是
我们在输入passcode1之后,调用system函数之前一拥有fflush printf scanf函数可以利用
这里如果选用fflush函数的话
修改他的GOT表为system函数的入口地址
这样一来当调用fflush函数时,就调用了system()地址

于是目标转换为,改写GOT-fflush地址内容
那么需要找到存放fflush地址的地方?

可以看到当调用fflush()时会跳转到0x804a004存放的地址
jmp    *0x804a004
那么我们可以令:(*0x804a004)=addr(system())

下边的目标就是寻找system()地址0x8048460

于是就可以搞了。。。



12.汇编学习
mov ax,[bx]是指将ds:bx处的数据放入ax 
mov ax,bx是指将bx中的数放入ax

AT&T: -4(%ebp)                         //相当于 Intel: [ebp - 4]
AT&T: foo(,%eax,4)                     //相当于 Intel: [foo + eax*4]
AT&T: foo(,1)                          //相当于 Intel:[foo]
AT&T: %gs:foo                          //相当于 Intel:gs:foo
AT&T: movl -4(%ebp), %eax              //相当于 Intel: mov eax, [ebp - 4]
AT&T: movl array(, %eax, 4), %eax      //相当于 Intel: mov eax, [eax*4 + array]
AT&T: movw array(%ebx, %eax, 4), %cx   //相当于 Intel: mov cx, [ebx + 4*eax + array]
AT&T: movb $4, %fs:(%eax)              //相当于 Intel: mov fs:eax, 4
package com.jsfj.business.websocket.config; import com.jsfj.business.websocket.config.Factory.CustomWebSocketHandlerDecoratorFactory; import com.jsfj.business.websocket.data.ActiveWebSocketUserRepository; import com.jsfj.business.websocket.handler.WebSocketConnectHandler; import com.jsfj.business.websocket.handler.WebSocketDisconnectHandler; import com.jsfj.business.websocket.handler.WsUser; import com.jsfj.commons.core.security.User; import com.jsfj.commons.security.CertifiedHeaderHelper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.simp.SimpMessageHeaderAccessor; import org.springframework.messaging.simp.config.ChannelRegistration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.messaging.simp.stomp.StompCommand; import org.springframework.messaging.simp.stomp.StompHeaderAccessor; import org.springframework.messaging.support.ChannelInterceptor; import org.springframework.messaging.support.MessageHeaderAccessor; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration; import org.springframework.web.socket.messaging.SessionConnectEvent; import org.springframework.web.socket.messaging.SessionDisconnectEvent; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean; import javax.annotation.Resource; import java.util.List; import java.util.Map; import java.util.Objects; @Slf4j @Configuration @EnableWebSocketMessageBroker @Order(Ordered.HIGHEST_PRECEDENCE + 99) // 确保配置高优先级 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { // 外部化配置参数 @Value("${stomp.broker.relay.host:mq.master.jshi9.com}") private String relayHost; @Value("${stomp.broker.relay.port:61613}") private int relayPort; @Value("${stomp.broker.client.login:jsfj_stomp}") private String clientLogin; @Value("${stomp.broker.client.passcode:jsfj_stomp}") private String clientPasscode; @Value("${stomp.broker.system.login:jsfj_stomp}") private String systemLogin; @Value("${stomp.broker.system.passcode:jsfj_stomp}") private String systemPasscode; @Value("${stomp.broker.virtualHost:/dev}") private String virtualHost; @Resource private TokenStore tokenStore; // 1. 增强端点注册安全 @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/connector/**") .setAllowedOriginPatterns("*") // 禁用不安全传输方式 //.setHandshakeHandler(new CustomHandshakeHandler()) .withSockJS() .setSupressCors(true); // 明确禁止CORS registry.addEndpoint("/sock-js") .setAllowedOriginPatterns("*") .withSockJS(); registry.addEndpoint("/web-socket") .setAllowedOriginPatterns("*"); //.addInterceptors(new IpHandshakeInterceptor()); // IP过滤 } // 2. 优化认证拦截器 @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.interceptors(new AuthChannelInterceptor()); } /** * 专用认证拦截器 (线程安全) */ private class AuthChannelInterceptor implements ChannelInterceptor { @Override public Message<?> preSend(Message<?> message, MessageChannel channel) { StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); if (accessor != null && StompCommand.CONNECT.equals(accessor.getCommand())) { // 优先使用token认证 String token = getHeaderInMessage(message, "Authorization"); if (token != null && token.startsWith("Bearer ")) { token = token.substring(7); User user = CertifiedHeaderHelper.getUser(token); if (user != null) { accessor.setUser(new WsUser(String.valueOf(user.getUserId()), user.getUserType())); return message; } } token = getHeaderInMessage(message, "token"); if (token != null && !token.startsWith("Bearer ")) { User user = CertifiedHeaderHelper.getUser(token); if (user != null) { accessor.setUser(new WsUser(String.valueOf(user.getUserId()), user.getUserType())); return message; } } // 备用方案:userID直接认证(生产环境应禁用) List<String> userIds = accessor.getNativeHeader("userId"); if (userIds != null && !userIds.isEmpty()) { String userId = userIds.get(0); accessor.setUser(new WsUser(userId, Objects.requireNonNull(accessor.getNativeHeader("type")).get(0))); } else { log.warn("WebSocket连接缺少认证信息"); return null; // 直接拒绝连接 } } return message; } } // 3. 消息代理优化配置 @Override public void configureMessageBroker(MessageBrokerRegistry registry) { // 开发/单机环境可以使用简单代理 // registry.enableSimpleBroker("/topic/", "/queue/", "/user/"); // registry.setApplicationDestinationPrefixes("/app"); //外部代理 //【首要任务】:在应用服务器上执行 telnet mq.master.jshi9.com 61613,排除网络问题。 //【确认配置】:在 RabbitMQ 服务器上执行 rabbitmq-plugins list | grep rabbitmq_stomp,确认插件已启 // # 为用户 jsfj_app 授予对虚拟主机 jsfj_stomp 的配置、写、读权限 # ".*" 表示对所有队列和交换机都有权限 // rabbitmqctl set_permissions -p dev jsfj_stomp ".*" ".*" ".*" // # 执行启用与重启 rabbitmq-plugins enable rabbitmq_stomp // sudo systemctl restart rabbitmq-server registry.enableStompBrokerRelay("/topic/", "/queue/", "/user/") .setRelayHost(relayHost) .setRelayPort(relayPort) .setClientLogin(clientLogin) .setClientPasscode(clientPasscode) .setSystemLogin(systemLogin) .setSystemPasscode(systemPasscode) .setVirtualHost(virtualHost) .setTaskScheduler(heartBeatScheduler()) // 心跳设置 (单位:毫秒) .setSystemHeartbeatSendInterval(5000) .setSystemHeartbeatReceiveInterval(4000); registry.setApplicationDestinationPrefixes("/app"); //registry.setUserDestinationPrefix("/user"); } // 4. 传输层优化 @Override public void configureWebSocketTransport(WebSocketTransportRegistration registration) { registration .setMessageSizeLimit(128 * 1024) // 128KB .setSendBufferSizeLimit(1024 * 1024) // 1MB .setSendTimeLimit(30 * 1000) // 30秒 //添加我们的自定义装饰器工厂 .setDecoratorFactories(new CustomWebSocketHandlerDecoratorFactory( )); } // 5. 容器级配置(底层TCP参数) @Bean public ServletServerContainerFactoryBean createWebSocketContainer() { ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); container.setMaxTextMessageBufferSize(128 * 1024); container.setMaxBinaryMessageBufferSize(128 * 1024); container.setMaxSessionIdleTimeout(30 * 60 * 1000L); // 30分钟 return container; } // 6. 消息转换器优化(JSON序列化) @Override public boolean configureMessageConverters(List<MessageConverter> messageConverters) { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setStrictContentTypeMatch(true); messageConverters.add(converter); return true; // 不使用默认转换器 } // 7. 线程池精细化配置 @Bean public ThreadPoolTaskScheduler heartBeatScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(2); // 增加线程容错 scheduler.setThreadNamePrefix("ws-hb-"); scheduler.setDaemon(true); scheduler.setAwaitTerminationSeconds(30); return scheduler; } // 工具方法优化 private String getHeaderInMessage(Message<?> message, String headerName) { if (message == null) { return null; } Object nativeHeaders = message.getHeaders().get(SimpMessageHeaderAccessor.NATIVE_HEADERS); if (!(nativeHeaders instanceof Map)) return null; Object values = ((Map<?, ?>) nativeHeaders).get(headerName); if (values instanceof List && !((List<?>) values).isEmpty()) { return ((List<?>) values).get(0).toString(); } return null; } @Bean public WebSocketConnectHandler<SessionConnectEvent> webSocketConnectHandler(ActiveWebSocketUserRepository repository) { return new WebSocketConnectHandler<>(repository); } @Bean public WebSocketDisconnectHandler<SessionDisconnectEvent> webSocketDisconnectHandler(ActiveWebSocketUserRepository repository) { return new WebSocketDisconnectHandler<>(repository); } } 2025-11-26 17:55:54.275 [http-nio-21006-exec-4] [DEBUG] [org.springframework.web.servlet.handler.AbstractHandlerMapping:522] - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@6b44121e 2025-11-26 17:55:54.276 [http-nio-21006-exec-4] [DEBUG] [org.springframework.web.socket.sockjs.support.AbstractSockJsService:412] - Processing transport request: GET http://192.168.0.39:21006/sock-js/info?t=1764150932682 2025-11-26 17:55:54.276 [http-nio-21006-exec-9] [DEBUG] [org.springframework.web.servlet.handler.AbstractHandlerMapping:522] - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@6b44121e 2025-11-26 17:55:54.276 [http-nio-21006-exec-8] [DEBUG] [org.springframework.web.servlet.handler.AbstractHandlerMapping:522] - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@6b44121e 2025-11-26 17:55:54.277 [http-nio-21006-exec-4] [DEBUG] [org.springframework.web.servlet.FrameworkServlet:1131] - Completed 200 OK 2025-11-26 17:55:54.278 [http-nio-21006-exec-8] [DEBUG] [org.springframework.core.log.LogFormatUtils:119] - GET "/sock-js/info?t=1764150952689", parameters={t:[1764150952689]} 2025-11-26 17:55:54.278 [http-nio-21006-exec-9] [DEBUG] [org.springframework.core.log.LogFormatUtils:119] - GET "/sock-js/info?t=1764150942694", parameters={t:[1764150942694]} 2025-11-26 17:55:54.281 [http-nio-21006-exec-8] [DEBUG] [org.springframework.web.servlet.handler.AbstractHandlerMapping:522] - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@6b44121e 2025-11-26 17:55:54.281 [http-nio-21006-exec-9] [DEBUG] [org.springframework.web.servlet.handler.AbstractHandlerMapping:522] - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@6b44121e 2025-11-26 17:55:54.282 [http-nio-21006-exec-8] [DEBUG] [org.springframework.web.socket.sockjs.support.AbstractSockJsService:412] - Processing transport request: GET http://192.168.0.39:21006/sock-js/info?t=1764150952689 2025-11-26 17:55:54.282 [http-nio-21006-exec-9] [DEBUG] [org.springframework.web.socket.sockjs.support.AbstractSockJsService:412] - Processing transport request: GET http://192.168.0.39:21006/sock-js/info?t=1764150942694 2025-11-26 17:55:54.283 [http-nio-21006-exec-9] [DEBUG] [org.springframework.web.servlet.FrameworkServlet:1131] - Completed 200 OK 2025-11-26 17:55:54.283 [http-nio-21006-exec-8] [DEBUG] [org.springframework.web.servlet.FrameworkServlet:1131] - Completed 200 OK 2025-11-26 17:55:54.395 [http-nio-21006-exec-6] [DEBUG] [org.springframework.web.servlet.handler.AbstractHandlerMapping:522] - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@6b44121e 2025-11-26 17:55:54.396 [http-nio-21006-exec-6] [DEBUG] [org.springframework.core.log.LogFormatUtils:119] - GET "/sock-js/310/ogh3yq34/websocket", parameters={} 2025-11-26 17:55:54.398 [http-nio-21006-exec-6] [DEBUG] [org.springframework.web.servlet.handler.AbstractHandlerMapping:522] - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@6b44121e 2025-11-26 17:55:54.399 [http-nio-21006-exec-6] [DEBUG] [org.springframework.web.socket.sockjs.support.AbstractSockJsService:482] - Processing transport request: GET http://192.168.0.39:21006/sock-js/310/ogh3yq34/websocket 2025-11-26 17:55:54.400 [http-nio-21006-exec-6] [DEBUG] [org.springframework.web.servlet.FrameworkServlet:1131] - Completed 101 SWITCHING_PROTOCOLS 2025-11-26 17:55:54.401 [http-nio-21006-exec-6] [DEBUG] [org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator:46] - New WebSocketServerSockJsSession[id=ogh3yq34] 2025-11-26 17:55:54.401 [http-nio-21006-exec-6] [INFO] [com.jsfj.business.websocket.config.Factory.CustomWebSocketHandlerDecorator:42] - WebSocket connection established. SessionId: ogh3yq34, RemoteAddress: /192.168.5.66:43530, User: null, TotalActiveConnections: 1, TotalConnections: 9 2025-11-26 17:55:54.412 [clientInboundChannel-35] [DEBUG] [org.springframework.core.log.CompositeLog:127] - CONNECT user=1956172433130041346 session=ogh3yq34 2025-11-26 17:55:54.412 [http-nio-21006-exec-1] [INFO] [com.jsfj.business.websocket.handler.WebSocketConnectHandler:43] - onLine ogh3yq34 2025-11-26 17:55:57.683 [clientInboundChannel-38] [DEBUG] [org.springframework.core.log.CompositeLog:127] - TCP connection closed already, ignoring DISCONNECT session=ogh3yq34 2025-11-26 17:55:57.685 [http-nio-21006-exec-5] [DEBUG] [org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator:70] - WebSocketServerSockJsSession[id=ogh3yq34] closed with CloseStatus[code=1000, reason=null] 2025-11-26 17:55:57.685 [http-nio-21006-exec-5] [ERROR] [com.jsfj.business.websocket.config.Factory.CustomWebSocketHandlerDecorator:58] - WebSocket connection closed. SessionId: ogh3yq34, CloseStatus: CloseStatus[code=1000, reason=null], TotalActiveConnections: 0 2025-11-26 17:55:57.687 [http-nio-21006-exec-5] [DEBUG] [org.springframework.web.socket.messaging.SubProtocolWebSocketHandler:525] - Clearing session ogh3yq34 2025-11-26 17:55:57.687 [http-nio-21006-exec-5] [INFO] [com.jsfj.business.websocket.handler.WebSocketDisconnectHandler:38] - outLine ogh3yq34 2025-11-26 17:55:57.689 [clientInboundChannel-41] [DEBUG] [org.springframework.core.log.CompositeLog:127] - TCP connection closed already, ignoring DISCONNECT session=ogh3yq34
最新发布
11-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值